Log4j2达最大滚动文件数后不再滚动,持续覆盖默认日志文件问题
解决Logback带.0初始日志文件的滚动停止问题
你遇到的问题是Logback的DefaultRolloverStrategy在处理带.0后缀的初始日志文件时,会把它纳入滚动文件的计数范围,导致达到max=10后无法正常滚动,反而直接覆盖初始文件。下面是具体的原因分析和解决方案:
问题根源
你的初始日志文件名是${machine}_My_Sample.0.log,滚动文件模式为${machine}_My_Sample.%i.log。DefaultRolloverStrategy会将.0文件视为第一个滚动归档文件,当max=10时,系统认为.0到.9已经是10个保留文件。再触发滚动时,策略会尝试删除最旧的.0文件,并将当前正在写入的.0重命名为.10——但此时.0正处于写入状态无法被删除,最终只能直接覆盖当前的.0文件,导致滚动功能停止。
解决方案:使用FixedWindowRollingPolicy
要实现“初始文件为.0,滚动日志从.1到.10”的需求,推荐替换为FixedWindowRollingPolicy,它可以明确指定滚动文件的索引范围,将初始.0文件排除在滚动计数之外。
修改后的完整配置如下:
appender.sample.type = RollingFile appender.sample.name = SampleRollingFile appender.sample.fileName = ${basedir}/logs/${machine}_My_Sample.0.log appender.sample.filePattern = ${basedir}/logs/${machine}_My_Sample.%i.log appender.sample.layout.type = PatternLayout appender.sample.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p [T:%T] %c{1}:%L - %m%n appender.sample.policies.type = Policies appender.sample.policies.size.type = SizeBasedTriggeringPolicy appender.sample.policies.size.size = 100MB # 替换为FixedWindowRollingPolicy来控制滚动索引范围 appender.sample.rollingPolicy.type = FixedWindowRollingPolicy # 滚动文件起始索引设为1 appender.sample.rollingPolicy.minIndex = 1 # 滚动文件最大索引设为10 appender.sample.rollingPolicy.maxIndex = 10 appender.sample.rollingPolicy.fileNamePattern = ${basedir}/logs/${machine}_My_Sample.%i.log
滚动逻辑说明
每次触发滚动(文件达到100MB)时,这个配置会执行以下步骤:
- 删除最旧的滚动文件
${machine}_My_Sample.10.log(如果存在) - 将
.9.log重命名为.10.log,.8.log重命名为.9.log……以此类推,直到.1.log重命名为.2.log - 将当前正在写入的
.0.log重命名为.1.log - 新建空的
.0.log继续写入日志
这样就能始终保持.0.log为当前活跃日志文件,.1.log到.10.log为滚动归档文件,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Selvakumar
相关产品推荐
相关产品推荐

