使用 slf4j 我可以执行以下操作:
logger.atInfo().setMessage("My message").addKeyValue("foo", "bar").addKeyValue("code", 42).log()
当与 Logback 的 Azure Monitor OpenTelemetry Exporter 和 Appender 一起使用时,会在
traces
App Insight 表中生成条目,如下所示:
如何使用log4j日志接口达到相同的结果?我找不到接受额外属性的方法重载。
如何使用log4j日志接口达到相同的结果?我找不到接受额外属性的方法重载。
ThreadContext
允许您添加上下文数据(如键值对),这些数据将包含在每条日志消息中。这类似于 SLF4J 的 MDC(映射诊断上下文),并且大多数布局都支持,包括 JsonLayout
和 PatternLayout
。import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
public class Logtest {
private static final Logger logger = LogManager.getLogger(Logtest.class);
public static void main(String[] args) {
// Add extra attributes using ThreadContext (similar to SLF4J MDC)
ThreadContext.put("Role", "Admin");
ThreadContext.put("Location", "USA");
ThreadContext.put("SessionId", "abc-123"):
// Log the message
logger.info("My message");
// Clear the context when done
ThreadContext.clearAll();
}
}
MapMessage
类允许您使用键值对创建结构化日志,这与 SLF4J 的 addKeyValue()
方法类似。import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.message.MapMessage;
public class Logtest {
private static final Logger logger = LogManager.getLogger(Logtest.class);
public static void main(String[] args) {
// Create a structured log message using MapMessage
MapMessage logEntry = new MapMessage();
logEntry.put("foo", "bar");
logEntry.put("code", "42");
// Log the structured message
logger.info(logEntry);
}
}
通过上述配置,
ThreadContext
和MapMessage
示例都将以结构化 JSON 格式输出日志。
{
"timeMillis": 1695408341456,
"thread": "main",
"level": "INFO",
"loggerName": "LogExample",
"message": "This is a structured log message",
"contextMap": {
"Role": "Admin",
"Location": "USA",
"SessionId": "abc-123"
}
}
日志跟踪(添加了额外属性):