一个springboot的生产项目,日志记录使用的是springboot默认的日志实现,设置的保留30天的日志文件,近期在生产环境中发现30天之前的日志并没有被清除,是怎么回事呢?

难道是因为中间重启过项目,导致logback的日志清理机制断掉了?也不应该呀,中间也重启过很多次也没出现这个问题呀

然后仔细想了想,中间修改过一次日志的滚动策略,原本是按照年月日每天进行日志滚动的,后来为了避免日志文件过大不便于查看,又增加了日志大小(50M)的滚动,目前不仅根据年月日进行滚动,并且当日志文件达到50M的时候也会进行滚动,在日志文件后面加数字,默认从0开始

新的日志策略如下:

  <!-- 系统日志输出 --><appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/info.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern><!-- 日志最大的历史 30天 --><maxHistory>30</maxHistory><!-- 单个日志文件达到50mb开始切分 --><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>50mb</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder></appender>

最终生成的日志文件名称如下:

info.2025-08-09.0.log

info.2025-08-09.1.log

info.2025-08-10.0.log

info.2025-08-10.1.log

由此分析,我之前的日志文件没有清除是因为,文件名称改变了,之前是没有数值后缀的,文件名变了之后logback匹配不到了

然后又问了大哥:

Logback 中的历史日志文件清除并不是直接根据 fileNamePattern 来执行的,而是通过与之关联的滚动策略中的设置来实现。具体来说,如果你使用的是基于时间的滚动策略(例如 TimeBasedRollingPolicy),那么会结合 fileNamePatternmaxHistory 参数来决定如何滚动以及何时删除旧的日志文件。

  • fileNamePattern:用于指定归档日志文件的名字模式,其中可以包含 %d{...} 以日期格式进行滚动切换。这个参数定义了日志文件滚动时的新名称格式,同时也帮助 Logback 确认滚动的时间单位(如按天、按月等)。
  • maxHistory:设置了要保留的旧日志文件的最大数量。对于 TimeBasedRollingPolicy 而言,它表示按照 fileNamePattern 中定义的时间单位保留相应数量的历史日志文件。例如,如果 fileNamePattern 设置为按天滚动,并且 maxHistory 设置为30,则Logback将仅保留最近30天的日志文件,超过30天的日志文件将会被自动删除。