Spring Boot应用控制台日志格式不一致的原因及配置排查
日志出现两种格式的原因及配置问题排查
核心原因:SLF4J日志绑定冲突
你的父POM里同时加了slf4j-simple和log4j-slf4j-impl,这俩都是SLF4J的具体日志实现绑定。SLF4J作为日志门面,同一时间只能生效一个绑定实现,多个绑定共存时,类加载机制会随机选一个,但不同组件可能触发不同的绑定加载,最终导致日志输出格式乱掉。
另外子POM里排除了spring-boot-starter-logging,而Spring Boot默认用的是Logback(就包含在这个starter里),这进一步打乱了日志依赖的统一性,部分框架组件可能会 fallback 到其他绑定,格式混乱问题更严重。
具体配置问题
- 父POM同时引入多个SLF4J绑定:
slf4j-simple和log4j-slf4j-impl共存,违反了SLF4J只能用单一绑定的原则 - 子POM没必要排除Spring Boot默认日志starter:
spring-boot-starter-logging是Spring Boot日志体系的基础,排除后默认日志配置失效,组件只能用其他绑定的默认格式 - 缺少统一日志配置文件:没明确指定日志格式的配置文件(比如logback.xml、log4j2.xml),不同绑定会用各自的默认输出格式
修复方案
清理冗余日志绑定:父POM里只留一个SLF4J绑定,推荐二选一:
- 想用Log4j2就保留
log4j-slf4j-impl,删掉slf4j-simple - 想用Spring Boot默认的Logback,就删掉
slf4j-simple和log4j-slf4j-impl,只留slf4j-api就行
修改后的父POM日志依赖示例:
<dependencies> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- Loggers --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <!-- 二选一:保留Log4j2绑定 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </dependency> </dependencies>- 想用Log4j2就保留
恢复Spring Boot默认日志依赖:子POM里删掉对
spring-boot-starter-logging的排除配置,让Spring Boot的日志自动配置生效:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <!-- 移除这段排除代码 --> <!-- <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> --> </dependency>添加统一日志配置文件:根据选的日志实现,在
src/main/resources目录加对应的配置文件,比如用Logback就加logback-spring.xml,定义统一输出格式:<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="CONSOLE"/> </root> </configuration>
内容的提问来源于stack exchange,提问作者Paul Marcelin Bejan
相关产品推荐
相关产品推荐

