Spring-Boot-Log-To-JSON-Format
参考链接:
- 以 JSON 格式获取日志输出
- Logback官网 - 输出日志格式
- Log4j 官网 - 输出日志格式
- Log4j 官网 - Pattern 属性说明
- 通过 logstash-logback-encoder 设置 logback 输出 json 格式日志
- 在 Spring Boot 中配置 logback 输出 json 格式日志
- 设置 logback 打印日志为 json 串
- 关于 log4j2 生成 json 格式日志
- 如何让 promtail 解析 JSON 日志到标签和时间戳
1. 简介
如今,大多数 Java 日志库都提供不同的布局(layout)选项来格式化日志——以精确满足每个项目的需求。
在本快速教程中,我们希望将日志条目格式化为 JSON 并输出。我们将了解如何在两个最广泛使用的日志库中实现这一点:Log4j2 和 Logback。
两者在内部都使用 Jackson 库以 JSON 格式表示日志。
有关这些库的介绍,请参阅我们的 Java 日志介绍文章。
2. Log4j2
Log4j2 是 Java 最流行的日志库 Log4j 的直接继任者。
作为 Java 项目的新标准,我们将展示如何配置它以输出 JSON。
2.1. Maven 依赖
首先,我们需要在 pom.xml 文件中包含以下依赖项:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.2</version>
</dependency>
</dependencies>
上述依赖项的最新版本可以在 Maven Central 找到:log4j-api, log4j-core, jackson-databind。
2.2. 使用 JsonLayout
然后,在我们的 log4j2.xml 文件中,我们可以创建一个使用 JsonLayout 的新 Appender(附加器),以及一个使用此 Appender 的新 Logger(记录器):
<Appenders>
<Console name="ConsoleJSONAppender" target="SYSTEM_OUT">
<JsonLayout complete="false" compact="false">
<KeyValuePair key="myCustomField" value="myCustomValue"/>
</JsonLayout>
</Console>
</Appenders>
<Logger name="CONSOLE_JSON_APPENDER" level="TRACE" additivity="false">
<AppenderRef ref="ConsoleJSONAppender"/>
</Logger>
如示例配置所示,可以使用 KeyValuePair 将自己的值添加到日志中,它甚至支持查看日志上下文。
将 compact 参数设置为 false 会增加输出的大小并使其更易于人类阅读。
现在,让我们测试我们的配置。在我们的代码中,可以实例化新的 JSON 记录器并进行新的调试级别跟踪:
Logger logger = LogManager.getLogger("CONSOLE_JSON_APPENDER");
logger.debug("Debug message");
上述代码的调试输出消息将是:
{
"instant" : {
"epochSecond" : 1696419692,
"nanoOfSecond" : 479118362
},
"thread" : "main",
"level" : "DEBUG",
"loggerName" : "CONSOLE_JSON_APPENDER",
"message" : "Debug message",
"endOfBatch" : false,
"loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
"threadId" : 1,
"threadPriority" : 5,
"myCustomField" : "myCustomValue"
}
2.3. 使用 JsonTemplateLayout
在上一节中,我们看到了如何使用 JsonLayout 属性。从版本 2.14.0 开始,该属性已被弃用,并由 JsonTemplateLayout 取代。
JsonTemplateLayout 提供了增强的功能和更高的效率,因为默认情况下它经过优化,可以尽可能快地编码日志事件。
此外,它支持无垃圾(garbage-free)日志记录,这带来了一些性能优势,因为垃圾收集器停顿可能会影响性能。要启用无垃圾日志记录,我们需要将 log4j2.garbagefreeThreadContextMap 和 log4j2.enableThreadLocals 属性设置为 true:
-Dlog4j2.garbagefreeThreadContextMap=true
-Dlog4j2.enableThreadlocals=true
要使用 JsonTemplateLayout