Spring项目log4j 2.13.3+版本无法通过log4j2.properties写日志到文件
问题原因
- 依赖冲突:Spring Boot 自带的
spring-boot-starter默认引入了基于logback实现的spring-boot-starter-logging,你未排除该默认依赖的情况下直接引入log4j2的原生依赖,会导致日志实现类冲突。低版本log4j2碰巧在类加载时优先级更高可正常工作,2.13.x+版本后类加载顺序变化,默认的logback实现生效,你的log4j2配置完全未被读取,logback默认仅输出日志到控制台。 - 缺少Spring Boot log4j2适配依赖:未引入Spring Boot官方提供的
spring-boot-starter-log4j2适配包,即使排除了默认日志实现,原生log4j2依赖也无法和Spring Boot的日志体系适配,导致配置无法正常加载。 - 配置完整性问题:现有log4j2配置仅指定了
com.example.demo包的日志输出规则,未配置rootLogger,若有超出该包范围的日志输出会找不到目标appender,触发 fallback 输出到控制台。
解决方案
1. 修正pom依赖配置
首先移除原有单独引入的log4j-api、log4j-core依赖,修改spring-boot-starter依赖排除默认日志实现,新增log4j2适配starter:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <!-- 排除默认的logback日志实现 --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入Spring Boot官方log4j2适配starter,自动管理兼容的log4j2版本 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!-- 其余原有依赖保持不变,删除原来单独加的log4j-api、log4j-core依赖 --> <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> </dependencies>
适配starter会自动引入和当前Spring Boot版本兼容的log4j2版本,无需手动指定版本号,避免版本不兼容问题。
2. 优化log4j2.properties配置
建议补充rootLogger配置,同时将配置开头的status改为debug,排查配置加载阶段的错误:
# 改为debug可输出log4j2自身的加载日志到控制台,排查问题后可改回error status = debug name = PropertiesConfig property.filename = C:\\logs\\debug.log filters = threshold filter.threshold.type = ThresholdFilter filter.threshold.level = debug appenders = rolling, console # 可选新增控制台appender,方便开发阶段调试 appender.console.type = Console appender.console.name = STDOUT appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %msg%n appender.rolling.type = RollingFile appender.rolling.name = RollingFile appender.rolling.fileName = ${filename} appender.rolling.filePattern = C:\\logs\\Previous\\debug-backup-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %msg%n appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.time.interval = 100000 appender.rolling.policies.time.modulate = true appender.rolling.policies.size.type = SizeBasedTriggeringPolicy appender.rolling.policies.size.size=10MB appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.max = 20 loggers = rolling logger.rolling.name = com.example.demo logger.rolling.level = debug logger.rolling.additivity = false logger.rolling.appenderRef.rolling.ref = RollingFile logger.rolling.appenderRef.console.ref = STDOUT # 补充rootLogger配置,处理所有未匹配到自定义logger的日志 rootLogger.level = info rootLogger.appenderRef.rolling.ref = RollingFile
3. 检查本地目录权限
确认C:\\logs、C:\\logs\\Previous目录已手动创建,且当前运行应用的Windows账号对该目录有读写权限,避免文件写入失败导致日志 fallback 到控制台输出。
内容的提问来源于stack exchange,提问作者Nguyen Tran Nhat Vu
相关产品推荐
相关产品推荐

