You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Logback滚动归档未删除过期日志问题排查求助

问题分析与解决方案

你的Logback配置中,导致过期日志未被自动删除的核心问题出在**aux修饰符的使用**以及对应的清理逻辑限制,具体原因和修复方案如下:

核心问题:aux修饰符阻碍了跨目录的过期文件扫描

你在FileNamePattern中对年月目录使用了aux修饰符:

<FileNamePattern>${LOGDIR}/logs/service/${SERVICE}_%d{yyyy-MM, aux}/${SERVICE}_%d{yyyy-MM-dd}_%i.log.gz</FileNamePattern>

aux标记的作用是将该日期维度(这里是年月)标记为辅助目录结构,Logback的SizeAndTimeBasedRollingPolicy在执行清理时,只会聚焦于当前滚动周期对应的辅助目录(比如当前月份的printPDF_2020-11),不会递归遍历所有历史年月目录(如2020-01、2020-02)来检查其中的文件是否过期。

这就导致那些早于90天的归档文件,因为所在的年月目录不在当前扫描范围内,永远不会被清理逻辑识别和删除。

修复方案

方案1:移除aux修饰符(推荐)

去掉aux标记后,Logback会正确遍历所有年月目录,根据文件名中的日期戳判断文件是否超过maxHistory=90天的保留期限:

<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  <!-- 移除aux修饰符 -->
  <FileNamePattern>${LOGDIR}/logs/service/${SERVICE}_%d{yyyy-MM}/${SERVICE}_%d{yyyy-MM-dd}_%i.log.gz</FileNamePattern>
  <maxHistory>90</maxHistory>
  <maxFileSize>100MB</maxFileSize>
  <totalSizeCap>20GB</totalSizeCap>
  <cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>

这个修改不会改变日志归档的目录结构(依然会按年月归档到对应目录),但会让Logback的清理逻辑能够扫描所有历史目录,删除过期文件。

方案2:升级Logback版本(针对旧版本bug)

如果你坚持使用aux修饰符,需要确认你的Logback版本是否存在相关清理逻辑的bug。部分1.1.x及更早的版本在处理带aux的多日期模式时,存在遍历不全的问题,升级到最新稳定版(如1.2.x系列)可能解决该问题。

额外验证点

  • 确认totalSizeCap=20GB尚未触发:如果归档文件总大小还没达到20GB,totalSizeCap的清理逻辑不会启动,此时完全依赖maxHistory的时间规则。
  • 检查日志权限:确保运行应用的用户对/data/work/logs/printPDF/logs/service目录及其子目录有读写权限,否则Logback无法删除文件。

验证效果

修改配置并重启应用后,控制台应该会输出类似以下的清理日志,表明Logback正在扫描并删除过期文件:

清理历史日志 - 已删除X个过期文件

内容的提问来源于stack exchange,提问作者Dave The Dane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:57:40