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

Log4j备份文件日期异常及午夜备份后日志停写问题求助

Log4j配置问题排查与修复

配置需求

  • 最多保留5个备份文件,单个文件最大20MB
  • 无论主文件当前大小,每日午夜执行备份
  • 删除超过21天的日志

当前配置代码

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
    <Properties>
        <Property name="basePath">${sys:user.home}/test</Property>
    </Properties>
 
    <Appenders>
        <RollingFile name="fileLogger" fileName="${basePath}/console.log" filePattern="${basePath}/console_backup/console-%d{yyyy-MM-dd}_%i.log">
            <PatternLayout>
                <pattern>%msg</pattern>
            </PatternLayout>
            <Policies>
                <CronTriggeringPolicy schedule="00 00 00 * * ?"/>
                <!-- MAKSYMALNY ROZMIAR PLIKU -->
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
            <!-- MAKSYMALNA ILOSC BACKUPOW -->
            <DefaultRolloverStrategy max="5">
                <Delete basePath="${basePath}/console_backup" >
                    <IfLastModified age="21d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
 
    </Appenders>
    <Loggers>
        <Logger name="name.john.doe.util.gui.ConsoleOutputStream" level="info" additivity="true">
            <appender-ref ref="fileLogger" level="info" />
        </Logger>
        <Root level="info" additivity="false">
            <appender-ref ref="console" />
        </Root>
    </Loggers>
</Configuration>

遇到的问题

  1. 备份文件日期错误:午夜生成的备份文件名称显示前一天日期(如7月8日生成的备份命名为console-2024-07-07_1.log),替换为TimeBasedTriggeringPolicy后日期恢复正常,但希望保留CronTriggeringPolicy以获取灵活配置。
  2. 偶发写入异常:午夜备份完成后,新生成的主日志文件console.log无内容写入,重启应用后恢复正常。

问题原因与修复方案

1. 备份文件日期错误修复

CronTriggeringPolicy默认使用日志事件的时间戳生成备份文件名,而非触发滚动操作的当前时间。而TimeBasedTriggeringPolicy默认使用滚动发生的时间,因此出现日期偏差。

只需给CronTriggeringPolicy添加useCurrentTime="true"参数,强制使用触发备份的当前时间(午夜)命名文件:

<CronTriggeringPolicy schedule="00 00 00 * * ?" useCurrentTime="true"/>

2. 主日志文件无写入问题修复

该问题通常是滚动后文件输出流未正确刷新或重新初始化导致的,可通过以下方式解决:

  • 给RollingFile appender添加immediateFlush="true",确保日志事件实时写入文件:
    <RollingFile name="fileLogger" fileName="${basePath}/console.log" filePattern="${basePath}/console_backup/console-%d{yyyy-MM-dd}_%i.log" immediateFlush="true">
    
  • 若使用旧版本Log4j(如2.17以下),建议升级至最新稳定版(如2.20.0+),旧版本存在部分滚动策略的线程安全bug;
  • 给Delete节点添加maxDepth="1"限制删除范围,避免误操作影响其他目录:
    <Delete basePath="${basePath}/console_backup" maxDepth="1" >
        <IfLastModified age="21d" />
    </Delete>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:13:13