Spring Boot 1.5.9迁移至2.7.7后Log4j配置被覆盖问题求助
Spring Boot 2.7.7 + Log4j 2.20.0 日志配置异常分析与解决
问题现象
- 自定义
log4j2.xml先被加载,随后被Spring Boot内置的log4j2.xml覆盖,导致自定义配置失效 - 启动后反复出现
ERROR StatusLogger Recursive call to appender Console错误日志
原因分析
- Spring Boot日志加载逻辑变更:Spring Boot 2.x版本对日志配置的优先级处理和1.5.x不同,默认会优先加载自身内置的日志配置,可能在自定义配置加载后触发重新配置覆盖
- Console Appender循环引用:自定义
log4j2.xml中存在Console Appender的递归配置,比如Appender引用自身、Logger与Appender形成循环关联等
解决步骤
1. 强制指定自定义Log4j2配置路径
通过启动参数或配置文件明确指定自定义配置位置,避免Spring Boot内置配置干扰:
- 启动参数方式:
java -jar your-app.jar --logging.config=file:/home/vboxuser/Desktop/cande2/cande2-config/log4j2.xml - application.properties配置:
logging.config=file:/home/vboxuser/Desktop/cande2/cande2-config/log4j2.xml - application.yml配置:
logging: config: file:/home/vboxuser/Desktop/cande2/cande2-config/log4j2.xml
2. 排查并修复自定义配置的循环引用
检查log4j2.xml中Console Appender的配置,消除递归逻辑:
- 禁止Appender的
ref属性指向自身 - 避免Logger配置中出现日志输出到Console Appender,同时该Appender又关联回此Logger的情况
- 示例正确的Console Appender配置:
<Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers>
3. 排除Spring Boot内置日志自动配置
若上述方法无效,可在启动类中排除Spring Boot的日志自动配置类,彻底避免其干扰:
@SpringBootApplication(exclude = {LoggingApplicationListener.class, Log4J2LoggingSystem.class}) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
4. 确认依赖配置正确性
确保pom.xml中正确引入Log4j2依赖,并排除Spring Boot默认的Logback依赖:
<dependencies> <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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.20.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.20.0</version> </dependency> </dependencies>
验证方式
启动项目后观察日志:
- 确认仅加载自定义
log4j2.xml,无Spring Boot内置配置加载的日志 - 检查是否不再出现
Recursive call to appender Console错误
内容的提问来源于stack exchange,提问作者Pradeep Reddy
相关产品推荐
相关产品推荐

