Log4j2保留日期戳文件名且限制日志总数为100的配置需求
解决Log4j2保留日期戳同时限制全局日志总数为100的问题
问题分析
你的配置中DefaultRolloverStrategy max="100"仅对同一日期前缀的日志文件生效(因为filePattern包含yyyy-MM-dd时间戳),导致每天都会生成最多100个文件,跨日期的旧文件不会被自动清理,最终总数远超100。
解决方案
通过在DefaultRolloverStrategy中添加Delete子策略,实现全局范围内保留最新的100个压缩日志文件,同时保留原有的日期戳命名规则。
修改后的完整配置如下:
<RollingFile name="RollingFileMarket" fileName="logs/app.log" filePattern="logs/app-%d{yyyy-MM-dd-HH-mm}-%i.log.gz" ignoreExceptions="true" immediateFlush="false" append="true" createOnDemand="true"> <PatternLayout pattern="%d %p %c{1.} [%t] %m %ex %map{} %n"/> <Policies> <OnStartupTriggeringPolicy/> <SizeBasedTriggeringPolicy size="50 MB"/> </Policies> <DefaultRolloverStrategy max="100"> <!-- 全局日志文件清理策略 --> <Delete basePath="logs" maxDepth="1"> <!-- 匹配所有符合命名规则的压缩日志 --> <IfFileName glob="app-*.log.gz"/> <!-- 当文件总数超过100时,删除最旧的文件 --> <IfAccumulatedFileCount exceeds="100"/> </Delete> </DefaultRolloverStrategy> </RollingFile>
关键配置说明
<Delete basePath="logs" maxDepth="1">:指定日志文件所在目录,maxDepth="1"表示仅检查当前目录,不递归子目录。<IfFileName glob="app-*.log.gz"/>:匹配所有以app-开头、.log.gz结尾的压缩日志文件,确保只清理目标日志。<IfAccumulatedFileCount exceeds="100"/>:当目录中符合条件的文件总数超过100时,自动删除最旧的文件(按修改时间排序),直到总数维持在100以内。
原有的max="100"可以保留,它会限制单日同一时间戳前缀下的文件数量,配合全局的Delete策略,既能避免单日文件爆炸,又能保证全局总数不超过100。
内容的提问来源于stack exchange,提问作者Ggdw
相关产品推荐
相关产品推荐

