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

Log4j2配置RollingFile未按天生成独立日志文件问题求助

问题解决方案

根因分析

日志不按天滚动的问题,通常由以下几个原因导致:

  • 依赖缺失:仅引入log4j-slf4j-impl不足以支撑log4j2的全部滚动功能,缺少核心依赖log4j-api、log4j-core,或三者版本不匹配
  • 配置拼写错误:原配置中patternLayout拼写为patterLayout,导致日志格式加载异常,可能影响滚动逻辑
  • 滚动策略配置问题:Cron触发策略的参数未配置完整,或启动时检查逻辑未生效
  • 目录权限不足:日志目录没有创建子目录的权限,导致滚动时生成归档文件失败
  • 日志级别配置过高:Configuration的status设为WARN,无法看到滚动过程中的具体报错信息

具体修复步骤

1. 补全pom.xml依赖

确保log4j2相关依赖版本统一,推荐使用2.17及以上的稳定版本避免安全漏洞:

<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.20.0</version>
    </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-slf4j-impl</artifactId>
        <version>2.20.0</version>
    </dependency>
</dependencies>

2. 优化log4j2.xml配置

按天滚动更推荐使用TimeBasedTriggeringPolicy,配置更简单不易出错:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 把status改成DEBUG,方便排查滚动报错,没问题后可以改回WARN -->
<Configuration package="log4j.test" status="DEBUG">
    <Properties>
        <Property name="baseDir">logs</Property>
        <Property name="patternLayout">%d{[dd.MM.yyyy HH:mm:ss.SSS]} %l %p:%n %m%n</Property>
    </Properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${patternLayout}"/>
        </Console>

        <RollingFile name="RollingFile" fileName="${baseDir}/trace.log"
                     filePattern="${baseDir}/$${date:yyyy-MM}/trace-%d{yyyy-MM-dd}.log.gz">
            <PatternLayout pattern="${patternLayout}"/>
            <!-- interval=1 配合filePattern的日期精度%d{yyyy-MM-dd},就是1天滚动一次 -->
            <!-- modulate=true 对齐零点触发滚动 -->
            <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            <DefaultRolloverStrategy>
                <Delete basePath="${baseDir}" maxDepth="2">
                    <IfFileName glob="*/trace-*.log.gz"/>
                    <IfLastModified age="60d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="trace">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile"/>
        </Root>
        <Logger name="org.apache.poi" level="error" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile"/>
        </Logger>
        <Logger name="org.apache.xmlbeans" level="error" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile"/>
        </Logger>
    </Loggers>
</Configuration>

如果坚持使用Cron触发,给策略加上onStartup="true"参数,确保应用启动时先检查是否需要滚动:

<CronTriggeringPolicy schedule="0 0 0 * * ?" onStartup="true"/>

3. 检查目录权限

确保运行Java应用的操作系统用户,对项目下的logs目录拥有读写、创建子目录的权限。

验证方法

修改配置后启动应用,主动调整系统时间到次日零点(或等待跨天),观察logs目录下是否生成对应日期的归档压缩日志文件,新写入的日志是否只出现在当前的trace.log中即可。

内容的提问来源于stack exchange,提问作者Alexei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:15:03