Spring Boot 1.5.9下如何将Log4j2日志通过SLF4J路由至Logback?
你已经找对了桥接的方向,但还需要调整依赖配置来解决那个Log4j2 could not find a logging implementation的错误,让桥接真正生效。下面是具体的解决步骤:
错误原因分析
你看到的错误是因为Log4j2的API(log4j-api)在类路径中,但它找不到官方实现包log4j-core,所以 fallback 到了内置的SimpleLogger。而我们的目标是用log4j-to-slf4j作为桥接,把Log4j2的日志调用转发给SLF4J,再由Spring Boot默认的日志框架Logback来处理输出,所以必须确保log4j-core不在类路径中,同时让桥接包正确生效。
具体配置步骤
1. 排除所有log4j-core依赖
首先检查你的Maven依赖,确保没有任何地方引入log4j-core。如果项目依赖了spring-boot-starter或其他可能带log4j-core的包,需要显式排除:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <!-- 排除log4j-core,避免冲突 --> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </exclusion> <!-- 排除Log4j2直接绑定SLF4J的包,避免和我们的桥接冲突 --> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </exclusion> </exclusions> </dependency>
2. 正确添加log4j-to-slf4j桥接依赖
建议使用Spring Boot的依赖管理来控制版本,避免版本不兼容问题(不用手动指定version):
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> </dependency>
这个包会自动依赖log4j-api,同时将所有Log4j2 API的调用转发到SLF4J。
3. 确保Logback的配置文件存在
Spring Boot默认会加载src/main/resources下的logback.xml或logback-spring.xml文件。如果没有自定义配置,Logback会使用默认规则输出到控制台;你也可以添加自定义配置来控制日志格式、输出位置等,示例如下:
<!-- logback-spring.xml 示例 --> <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>
验证配置
完成上述步骤后,重新运行代码,之前的ERROR StatusLogger提示应该会消失,日志会通过Logback输出,格式会和你在Logback配置中定义的一致。
内容的提问来源于stack exchange,提问作者Ali




