Logback 1.2.3中SizeAndTimeBasedRollingPolicy达5GB总容量时误删全部归档文件求助
解决Logback 1.2.3中SizeAndTimeBasedRollingPolicy触发totalSizeCap时删除所有归档的问题
你遇到的这个情况,其实是Logback 1.2.3版本里SizeAndTimeBasedRollingPolicy的一个典型bug——当totalSizeCap设置为maxFileSize的整数倍时,触发容量上限后会错误地删除所有归档文件,而非仅清理最旧的文件。
从你的配置来看:
maxFileSize=1GBtotalSizeCap=5GB,刚好是前者的5倍,这就是触发问题的核心原因。
临时修复方案
可以先试试这几个快速调整的方法:
- 修改totalSizeCap为非整数倍值:比如把
totalSizeCap改成5.1GB,避开和maxFileSize的整数倍关联,这样RollingPolicy应该能正确计算需要删除的旧文件,不会再全部清空归档。 - 手动核对归档文件总大小:因为你的日志是压缩格式(
.gz),Logback计算totalSizeCap时是基于压缩后的实际大小。你可以手动统计现有归档文件的总大小,确认是否真的达到了5GB阈值,避免因计算偏差导致误触发。
长期解决方案
- 升级Logback版本:Logback 1.2.3是2017年的旧版本,后续的1.2.x稳定版(比如1.2.11及以上)修复了多个
SizeAndTimeBasedRollingPolicy的逻辑bug,包括totalSizeCap的计算问题。升级到新版本能彻底解决这个问题。 - 确认归档文件名格式:检查你的
fileNamePattern是否正确,%d{yyyyMMdd}和%i的组合要能让Logback准确识别归档文件的时间顺序和索引,避免排序混乱导致错误删除。
你的配置参考
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${tivo.logpath}/${tivo.logfilename}.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- Rollover everyday. If file exceeds 1GB within a day, then file is archived with index starting from 0 --> <fileNamePattern>${tivo.logpath}/${tivo.logfilename}-%d{yyyyMMdd}-%i.log.gz</fileNamePattern> <!-- Each file should be at most 1GB --> <maxFileSize>1GB</maxFileSize> <!-- Keep maximum 30 days worth of archive files, deleting older ones --> <maxHistory>30</maxHistory> <!-- Total size of all archived files is at most 5GB --> <totalSizeCap>5GB</totalSizeCap> </rollingPolicy> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="com.tivo.logging.logback.layout.JsonLayout"> <env>${envId}</env> <datacenter>${dcId}</datacenter> <serverId>${serverId}</serverId> <build>${info.properties.buildChange}</build> <service>${tivo.appname}</service> </layout> </encoder> </appender>
建议先尝试调整totalSizeCap的数值验证效果;如果问题依旧,升级Logback版本是更可靠的长期解决方案。
内容的提问来源于stack exchange,提问作者trojansmith1990
相关产品推荐
相关产品推荐

