Spring Boot调用时Log4j不输出到文件,命令行调用正常如何解决?
解决方案
根因说明
Spring Boot 默认内置Logback作为日志实现,自动配置的优先级高于你手动引入的log4j2依赖,因此启动REST服务时会优先使用Logback加载配置,你写的log4j2.xml未被识别生效,日志只会输出到控制台;而命令行启动的入口没有触发Spring的日志自动装配逻辑,所以可以正常加载log4j2配置写入文件。
修复步骤
1. 排除Spring Boot默认日志依赖
在Spring Boot服务模块的pom.xml中,找到spring-boot-starter或spring-boot-starter-web依赖,添加排除规则移除默认的Logback相关依赖:
<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>
2. 引入Spring Boot官方Log4j2 Starter
你当前仅引入了log4j-slf4j-impl依赖不够适配Spring Boot环境,替换为官方提供的log4j2启动器,自动完成版本适配避免冲突:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
无需额外指定版本,会自动继承父pom中Spring Boot对应的版本号。
3. 调整配置文件位置
如果是多模块项目,需要将log4j2.xml放到Spring Boot启动类所在模块的src/main/resources根目录下,确保Spring Boot启动时可以扫描到该配置文件。
4. 可选:显式指定配置文件路径
如果需要自定义配置文件位置,可以在Spring Boot的application.properties中添加如下配置:
logging.config=classpath:log4j2.xml
也可以在启动服务时通过JVM参数指定:
java -jar your-spring-boot-app.jar -Dlogging.config=classpath:log4j2.xml
其他说明
你当前log4j2.xml中File Appender的append属性配置为false,每次服务重启都会覆盖旧的task.log文件,如果需要保留历史日志可以修改为true。
内容的提问来源于stack exchange,提问作者Matteo NNZ
相关产品推荐
相关产品推荐

