
本文详解如何在 Log4j2 中保持带时间戳(如 yyyy-MM-dd-HH-mm)的日志归档文件总数始终不超过 100 个,避免因日期切换导致文件数量线性累积。核心方案是结合 DeleteAction 与 IfAccumulatedFileCount 条件实现精准、自动的旧文件清理。
本文详解如何在 log4j2 中保持带时间戳(如 `yyyy-mm-dd-hh-mm`)的日志归档文件总数始终不超过 100 个,避免因日期切换导致文件数量线性累积。核心方案是结合 `deleteaction` 与 `ifaccumulatedfilecount` 条件实现精准、自动的旧文件清理。
Log4j2 原生的 <defaultrolloverstrategy max="100"></defaultrolloverstrategy> 仅控制单次滚动周期内保留的归档文件数(例如每次 rollover 后最多留 100 个),但不会跨周期(如跨天、跨小时)进行全局清理——这正是你遇到问题的根本原因:filePattern="logs/app-%d{yyyy-MM-dd-HH-mm}-%i.log.gz" 生成大量带精确时间戳的文件,而默认策略无法感知“所有匹配该 pattern 的历史文件总数”,导致第 1 天存 100 个、第 2 天又新增 100 个,依此类推。
要真正实现 “任意时刻,整个 logs/ 目录下符合该命名规则的 .log.gz 文件总数 ≤ 100”,必须启用 Log4j2 的高级清理机制:DeleteAction 配合条件判断器(Predicate)。以下是推荐的生产级配置方案:
<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 控制,改用 Delete 动作 -->
<Delete basePath="logs" maxDepth="1">
<!-- 匹配所有归档日志文件 -->
<PathCondition>
<IfFileName glob="app-*.log.gz"/>
</PathCondition>
<!-- 按文件数量排序(升序:最老在前),删除超出 100 的部分 -->
<PathCondition>
<IfAccumulatedFileCount exceeds="100">
<PathSort>
<PathSortByModificationTime/>
</PathSort>
</IfAccumulatedFileCount>
</PathCondition>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>✅ 关键说明:
-
basePath="logs"指定扫描根目录(确保与filePattern路径一致); -
maxDepth="1"限制只扫描logs/一级子目录,避免误删嵌套路径; -
<iffilename glob="app-*.log.gz"></iffilename>精确匹配你的归档文件名模式(支持通配符,比正则更轻量); -
<ifaccumulatedfilecount exceeds="100"></ifaccumulatedfilecount>是核心逻辑:当匹配到的文件总数 > 100 时,触发后续删除动作; -
<pathsortbymodificationtime></pathsortbymodificationtime>确保按修改时间升序排序(即最旧的排在前面),配合exceeds实现“保留最新的 100 个,删掉其余最旧的”。
⚠️ 注意事项:
- 此功能要求 Log4j2 版本 ≥ 2.8(强烈建议使用 2.20.0+ 以获得稳定性和安全修复);
-
Delete动作在每次 rollover(归档)后执行,因此清理是及时的,无需额外调度; - 若日志写入极高频(如每秒多次 rollover),建议将
filePattern中的HH-mm改为HH或dd以降低文件碎片,提升清理效率; - 测试阶段可在
Delete标签中添加testMode="true"(如<delete ... testmode="true"></delete>)模拟运行,查看哪些文件会被删,确认逻辑无误后再关闭。
通过此配置,无论运行多少天,logs/ 目录下 app-*.log.gz 文件总数将严格维持在 100 以内——既保留了你所需的高精度时间戳命名,又实现了真正的容量硬约束。

















