Spring Boot中Log4j2+SLF4J自定义日志无法输出问题求助
Spring Boot Log4j2+SLF4J自定义日志无输出问题修复
问题现象
在Spring Boot应用中配置Log4j2搭配SLF4J后,控制台和文件日志仅输出Spring Boot相关内容,自定义日志完全不显示;移除spring-boot-starter-web中对spring-boot-starter-logging的排除后,自定义日志能输出,但文件日志功能失效。
核心原因
- SLF4J绑定依赖仅在测试环境生效:
log4j-slf4j18-impl的scope设为test,主程序运行时没有SLF4J到Log4j2的绑定,自定义日志找不到正确的实现渠道。 - 默认日志框架未完全排除:除了
spring-boot-starter-web,spring-boot-starter-data-jpa、spring-boot-starter-security等starter也依赖spring-boot-starter-logging(默认用Logback),只排除web模块的默认日志会导致框架冲突,日志路由混乱。
修复步骤
1. 修正Maven依赖配置
推荐直接使用Spring Boot官方的Log4j2 Starter,自动处理版本兼容和依赖绑定,同时统一排除所有starter中的默认日志:
<dependencies> <!-- 数据JPA Starter,排除默认日志 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- Web Starter,排除默认日志 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- Security Starter,排除默认日志 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入Spring Boot Log4j2 Starter,自动包含log4j-api、core和SLF4J绑定 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!-- 保留其他原有依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency> <dependency> <groupId>commons-validator</groupId> <artifactId>commons-validator</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>32.1.3-jre</version> </dependency> </dependencies>
2. 调整Log4j2配置(可选优化)
确保log4j2.xml放在src/main/resources目录下,若需要给自定义代码单独配置日志级别,可添加包级Logger,同时修正原配置中的日期格式错误:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="DEBUG"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </Console> <File name="MyFile" fileName="all.log" immediateFlush="true" append="false"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </File> </Appenders> <Loggers> <!-- 自定义代码所在包,比如com.example,设置日志级别 --> <Logger name="com.example" level="info" additivity="false"> <AppenderRef ref="Console"/> <AppenderRef ref="MyFile"/> </Logger> <Root level="info"> <AppenderRef ref="Console" /> <AppenderRef ref="MyFile"/> </Root> </Loggers> </Configuration>
3. 验证自定义日志代码
确保代码中正确使用SLF4J Logger:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class CustomController { private static final Logger logger = LoggerFactory.getLogger(CustomController.class); @GetMapping("/test-log") public String testLog() { logger.info("这是自定义Info日志"); logger.debug("这是自定义Debug日志"); return "日志测试完成"; } }
4. 清理依赖缓存
执行mvn clean install命令,清理旧的依赖缓存,避免冲突jar包残留。
内容的提问来源于stack exchange,提问作者Anirudh Gambhir
相关产品推荐
相关产品推荐

