You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:06:05