Spring Boot 3集成Logback:如何仅输出JSON格式日志?
Spring Boot 3 日志仅输出JSON格式配置问题
问题描述
已为Spring Boot 3应用配置JSON格式日志,添加了logback-contrib相关依赖并配置了logback-spring.xml,但日志同时输出原始格式和JSON格式,需要调整配置仅保留JSON格式。
已配置内容
pom.xml依赖
<dependency> <groupId>ch.qos.logback.contrib</groupId> <artifactId>logback-json-classic</artifactId> <version>0.1.5</version> </dependency> <dependency> <groupId>ch.qos.logback.contrib</groupId> <artifactId>logback-jackson</artifactId> <version>0.1.5</version> </dependency>
logback-spring.xml原配置
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.contrib.json.classic.JsonLayout"> <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat> <timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId> <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter"> <prettyPrint>true</prettyPrint> </jsonFormatter> </layout> </encoder> </appender> <springProfile name="local"> <root level="DEBUG"> <appender-ref ref="CONSOLE"/> </root> </springProfile> </configuration>
当前问题现象
日志同时输出原始格式和JSON格式:
2023-07-21T14:41:24.899+02:00 INFO 34088 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. { "timestamp" : "2023-07-21T12:41:24.899Z", "level" : "INFO", "thread" : "SpringApplicationShutdownHook", "logger" : "com.zaxxer.hikari.HikariDataSource", "message" : "HikariPool-1 - Shutdown completed.", "context" : "default" }
解决方案
问题根源是引入的org/springframework/boot/logging/logback/base.xml内部已定义了一个CONSOLE appender,和自定义的CONSOLE appender重复,导致日志被输出两次。提供两种解决方式:
方案1:移除base.xml引用,自定义完整配置
不再依赖默认base.xml的配置,完全自定义日志输出逻辑:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.contrib.json.classic.JsonLayout"> <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat> <timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId> <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter"> <prettyPrint>true</prettyPrint> </jsonFormatter> </layout> </encoder> </appender> <springProfile name="local"> <root level="DEBUG"> <appender-ref ref="CONSOLE"/> </root> </springProfile> <!-- 可按需添加其他环境配置,例如生产环境 --> <springProfile name="prod"> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </springProfile> </configuration>
方案2:覆盖默认的CONSOLE appender
若需要保留base.xml中的其他配置(如文件输出),可直接复用默认的CONSOLE名称覆盖原有appender:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> <!-- 使用默认CONSOLE名称,覆盖原有的appender配置 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.contrib.json.classic.JsonLayout"> <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat> <timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId> <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter"> <prettyPrint>true</prettyPrint> </jsonFormatter> </layout> </encoder> </appender> <springProfile name="local"> <root level="DEBUG"/> </springProfile> </configuration>
任选一种方案调整后,日志将仅输出JSON格式内容。
内容的提问来源于stack exchange,提问作者Ali Behzadian Nejad
相关产品推荐
相关产品推荐

