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
相关产品推荐
相关产品推荐

