Log4j 2.14.1配置咨询:如何实现每日生成单个日志文件并自动删除N天前旧日志?
解决Log4j 2.14.1中DirectWriteRolloverStrategy无法自动删除旧日志的问题
你遇到的这个问题确实是DirectWriteRolloverStrategy的设计限制——它的maxFiles属性仅控制同一时间周期内允许存在的文件数量(比如同一天内如果触发多次滚动,只会保留指定数量的文件),而不是全局的日志保留天数或文件总数。而且如你所说,Delete动作目前只支持DefaultRolloverStrategy,这也是官方文档明确的规则。
下面给你两种可行的解决方案,优先推荐第一种,因为是Log4j原生支持的配置方式:
方案一:切换到DefaultRolloverStrategy + Delete Action
这是最直接的官方解决方案,通过DefaultRolloverStrategy配合Delete动作来实现每日滚动+自动清理旧日志。以下是适配你需求的properties配置示例:
appender.rolling.type = RollingFile appender.rolling.name = ROLLING appender.rolling.fileName = /var/log/application.log appender.rolling.filePattern = /var/log/application-%d{yyyy-MM-dd}.log appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = [%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC}Z][%p][%C:%L] %m%n # 触发滚动的策略:每日滚动 appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.time.interval = 1 appender.rolling.policies.time.modulate = true # 滚动策略配置:启用Delete动作清理10天前的日志 appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.delete.type = Delete appender.rolling.strategy.delete.basePath = /var/log appender.rolling.strategy.delete.maxDepth = 1 # 保留最近10天的日志,匹配application-yyyy-MM-dd.log格式的文件 appender.rolling.strategy.delete.ifLastModified.type = IfLastModified appender.rolling.strategy.delete.ifLastModified.age = 10d appender.rolling.strategy.delete.ifFileName.type = IfFileName appender.rolling.strategy.delete.ifFileName.glob = application-*.log
配置说明:
fileName指定当前活跃日志文件的路径,filePattern定义滚动后的归档文件名格式;TimeBasedTriggeringPolicy设置interval=1实现每日滚动,modulate=true确保滚动时间对齐到午夜;Delete动作通过ifLastModified.age=10d保留最近10天的日志,ifFileName.glob精准匹配你的日志文件名格式,避免误删其他文件;basePath和maxDepth限制清理的范围,防止递归删除不必要的目录。
方案二:保留DirectWriteRolloverStrategy + 外部定时清理工具
如果你因为某些原因必须使用DirectWriteRolloverStrategy,可以通过外部定时任务(比如Linux的cron)来定期清理旧日志。例如,添加一个每天执行的cron任务:
# 每天凌晨2点删除/var/log目录下10天前的application-*.log文件 0 2 * * * find /var/log -name "application-*.log" -mtime +10 -delete
这种方式需要额外维护定时任务,但能满足你的需求。
另外提醒下:Log4j 2.14.1存在一些已知的安全漏洞(比如Log4Shell),如果条件允许,建议升级到最新的稳定版本(比如2.20.0及以上),不仅能获得更完善的功能,也能保证安全性。
内容的提问来源于stack exchange,提问作者Alan Franzoni
相关产品推荐
相关产品推荐

