Log4j2 RollingFile仅保留4天日志,求问题原因排查
问题原因
你遇到的仅保留最近4天日志的问题,核心是缺少自定义的归档清理策略,同时未配置按时间触发归档的规则,导致Log4j2默认的滚动策略自动删除了旧日志:
- 默认滚动策略的限制:Log4j2的
RollingFileAppender默认使用DefaultRolloverStrategy,该策略默认仅保留7个归档文件。你的配置仅依赖SizeBasedTriggeringPolicy(按32MB滚动)和OnStartupTriggeringPolicy(启动时滚动),每天会生成多个归档文件,当总数超过7个时,会自动删除最早的文件,最终只留下最近几天的日志。 - 未按时间触发归档:配置里缺少
TimeBasedTriggeringPolicy,无法保证每天自动创建新归档目录并完成滚动,日志滚动完全依赖文件大小或服务启动,导致归档逻辑混乱。 - 额外配置错误:
fileName属性里的多余$符号($/home/myservice/myservice.log)属于无效配置,虽不直接导致日志丢失,但会影响路径解析,建议移除。
修复后的配置示例
<Configuration> <Appenders> <Console name="STDOUT" target="SYSTEM_OUT"> <PatternLayout> <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p (%t) %c{1.} %m%n</Pattern> </PatternLayout> </Console> <RollingFile name="RollingFile" fileName="/home/myservice/myservice.log" filePattern="/mnt/logbackups/%d{yyyy-MM-dd}/myservice-%d{yyyy-MM-dd}-%i.log.gz" > <PatternLayout> <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p (%t) %c{1.} %m%n</Pattern> </PatternLayout> <Policies> <OnStartupTriggeringPolicy /> <SizeBasedTriggeringPolicy size="32 MB"/> <!-- 添加按天触发归档的策略 --> <TimeBasedTriggeringPolicy interval="1"/> </Policies> <!-- 配置自定义清理策略,保留30天的日志 --> <RolloverStrategy type="Default"> <Delete basePath="/mnt/logbackups" maxDepth="2"> <!-- 匹配所有归档日志文件 --> <IfFileName glob="*/myservice-*.log.gz"/> <!-- 删除30天前的日志 --> <IfLastModified age="30d"/> </Delete> </RolloverStrategy> </RollingFile> </Appenders> <!-- 关联日志到指定Appender --> <Loggers> <Root level="info"> <AppenderRef ref="STDOUT"/> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
关键修复说明
- 添加
TimeBasedTriggeringPolicy:保证每天自动完成日志滚动,按日期创建独立目录,符合你按日划分的需求。 - 配置
DefaultRolloverStrategy+Delete规则:自定义日志保留时长(示例为30天),替代默认的文件数限制,彻底解决旧日志被误删的问题。 - 移除
fileName中的多余$符号:确保日志文件路径解析正确。
内容的提问来源于stack exchange,提问作者KoenDG
相关产品推荐
相关产品推荐

