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>
遇到的问题
- 备份文件日期错误:午夜生成的备份文件名称显示前一天日期(如7月8日生成的备份命名为
console-2024-07-07_1.log),替换为TimeBasedTriggeringPolicy后日期恢复正常,但希望保留CronTriggeringPolicy以获取灵活配置。 - 偶发写入异常:午夜备份完成后,新生成的主日志文件
console.log无内容写入,重启应用后恢复正常。
问题原因与修复方案
1. 备份文件日期错误修复
CronTriggeringPolicy默认使用日志事件的时间戳生成备份文件名,而非触发滚动操作的当前时间。而TimeBasedTriggeringPolicy默认使用滚动发生的时间,因此出现日期偏差。
只需给CronTriggeringPolicy添加useCurrentTime="true"参数,强制使用触发备份的当前时间(午夜)命名文件:
<CronTriggeringPolicy schedule="00 00 00 * * ?" useCurrentTime="true"/>
2. 主日志文件无写入问题修复
该问题通常是滚动后文件输出流未正确刷新或重新初始化导致的,可通过以下方式解决:
- 给
RollingFileappender添加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
相关产品推荐
相关产品推荐

