Logback1.2.3中totalSizeCap搭配SizeAndTimeBasedRollingPolicy不生效问题
问题根因与修复方案
Logback 1.2.3版本中totalSizeCap未生效是配置缺失和版本已知特性共同导致的,具体原因和修复方法如下:
核心原因
SizeAndTimeBasedRollingPolicy要求fileNamePattern必须包含%i占位符(用于标记按大小拆分的日志分片序号),同时必须配置maxFileSize指定单文件大小阈值,缺少这两个配置时,日志归档统计逻辑无法正常识别所有归档文件,总大小计算错误导致totalSizeCap不生效- 当前配置中使用了
%d{yyyy-MM, aux}作为二级目录存放历史日志,Logback 1.2.3的归档扫描逻辑存在嵌套目录遍历缺陷,统计总大小时会漏算子目录内的历史日志,导致总大小统计值远低于实际值,无法触发旧日志清理 - 若
${HISTORY_SIZE}参数未携带单位,默认单位为字节,很容易出现配置值远小于预期的情况,看起来像totalSizeCap未生效
修复方案
方案1:保留按时间+大小切分日志的逻辑
补充缺失的配置项即可,修正后的配置如下:
<springProfile name="prod"> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${HISTORY_LOCATION}/%d{yyyy-MM, aux}/log.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 补充单日志文件最大大小配置,可根据需求调整 --> <maxFileSize>100MB</maxFileSize> <maxHistory>${HISTORY_LENGTH}</maxHistory> <!-- 确保HISTORY_SIZE参数携带单位,例:10GB、500MB --> <totalSizeCap>${HISTORY_SIZE}</totalSizeCap> </rollingPolicy> </appender> </springProfile>
方案2:不需要按大小拆分单天日志
如果只需要按天切分日志,同时限制总大小,可以更换为TimeBasedRollingPolicy,同时建议升级Logback版本到1.2.12及以上稳定版,修复嵌套目录扫描的已知缺陷。
内容的提问来源于stack exchange,提问作者Memija
相关产品推荐
相关产品推荐

