Log4J 2.17.2配置IfFileName与properties无法删除旧日志文件问题
Log4J 2.17.2 滚动日志旧文件无法删除的解决方法
问题描述
应用使用Log4J 2.17.2版本,通过properties文件配置滚动日志,但旧日志文件始终无法自动删除。当前目录下的日志文件列表:
-rw-rw-r--. 1 xxx xxx 1209 Feb 8 00:00 solr-20230207.log.zip -rw-rw-r--. 1 xxx xxx 1184 Feb 9 00:00 solr-20230208.log.zip -rw-rw-r--. 1 xxx xxx 18118 Feb 10 00:00 solr-20230209.log.zip -rw-rw-r--. 1 xxx xxx 2438 Feb 11 00:01 solr-20230210.log.zip -rw-rw-r--. 1 xxx xxx 1184 Feb 12 00:01 solr-20230211.log.zip -rw-rw-r--. 1 xxx xxx 1192 Feb 13 00:01 solr-20230212.log.zip -rw-rw-r--. 1 xxx xxx 1184 Feb 14 00:01 solr-20230213.log.zip -rw-rw-r--. 1 xxx xxx 14000 Feb 14 09:16 solr.log
当前使用的配置文件内容:
appender.solrAppender.type = RollingFile appender.solrAppender.name = SOLRFile appender.solrAppender.fileName = ${...}/solr/solr.log appender.solrAppender.filePattern = ${...}/solr/solr-%d{yyyyMMdd}.log.zip appender.solrAppender.layout.type = PatternLayout appender.solrAppender.layout.pattern = %d %p %C{1.} [%t] %m%n appender.solrAppender.policies.type = Policies appender.solrAppender.policies.trigger.type=TimeBasedTriggeringPolicy appender.solrAppender.strategy.type = DefaultRolloverStrategy appender.solrAppender.strategy.deleteAction.type=Delete appender.solrAppender.strategy.deleteAction.basePath=${...}/solr/ appender.solrAppender.strategy.deleteAction.maxDepth=2 appender.solrAppender.strategy.deleteAction.testMode=false appender.solrAppender.strategy.deleteAction.followLinks=false appender.solrAppender.strategy.deleteAction.fileName.type=IfFileName appender.solrAppender.strategy.deleteAction.fileName.glob=*/solr-*.log.zip appender.solrAppender.strategy.deleteAction.fileCount.type=IfAccumulatedFileCount appender.solrAppender.strategy.deleteAction.fileCount.age=2
问题分析
- Glob匹配规则错误:配置里的
glob=*/solr-*.log.zip会匹配solr目录下子文件夹中的文件,但实际日志都直接存在solr根目录,这个规则无法命中目标文件。 - 删除条件参数错误:
IfAccumulatedFileCount的有效配置参数是count(保留文件数量),而非age,原配置里的age=2属于无效设置,导致删除逻辑不生效。
修正后的配置
appender.solrAppender.type = RollingFile appender.solrAppender.name = SOLRFile appender.solrAppender.fileName = ${...}/solr/solr.log appender.solrAppender.filePattern = ${...}/solr/solr-%d{yyyyMMdd}.log.zip appender.solrAppender.layout.type = PatternLayout appender.solrAppender.layout.pattern = %d %p %C{1.} [%t] %m%n appender.solrAppender.policies.type = Policies appender.solrAppender.policies.trigger.type=TimeBasedTriggeringPolicy # 显式设置每天滚动一次,默认值为1,可省略 appender.solrAppender.policies.trigger.interval=1 appender.solrAppender.strategy.type = DefaultRolloverStrategy appender.solrAppender.strategy.deleteAction.type=Delete appender.solrAppender.strategy.deleteAction.basePath=${...}/solr/ appender.solrAppender.strategy.deleteAction.maxDepth=1 # 无需遍历子目录,设为1即可 appender.solrAppender.strategy.deleteAction.testMode=false appender.solrAppender.strategy.deleteAction.followLinks=false # 匹配solr根目录下的压缩日志文件 appender.solrAppender.strategy.deleteAction.fileName.type=IfFileName appender.solrAppender.strategy.deleteAction.fileName.glob=solr-*.log.zip # 设置保留最近2个日志文件,超出则自动删除 appender.solrAppender.strategy.deleteAction.fileCount.type=IfAccumulatedFileCount appender.solrAppender.strategy.deleteAction.fileCount.count=2
可选扩展配置
如果需要按时间维度删除(比如删除3天前的日志),可以替换IfAccumulatedFileCount为IfLastModified,配置如下:
appender.solrAppender.strategy.deleteAction.age.type=IfLastModified appender.solrAppender.strategy.deleteAction.age.age=3d
建议先开启testMode=true,查看日志输出中标记的待删除文件,确认规则正确后再关闭测试模式,避免误删。
内容的提问来源于stack exchange,提问作者Master
相关产品推荐
相关产品推荐

