我最近使用 log4j 1.2 桥接 API 将 log4j 1.2.13 更新到 log4j 2.17.2。
我现有的 RollingFileAppender 配置如下:
log4j.appender.app=org.apache.log4j.RollingFileAppender
log4j.appender.app.layout=org.apache.log4j.PatternLayout
log4j.appender.app.layout.ConversionPattern=%d %-5p [%-4t] %c{1}.%M(%L) | %m%n
log4j.appender.app.File=${applicationLogs}/app.log
log4j.appender.app.Encoding=UTF-8
log4j.appender.app.MaxFileSize=10KB
log4j.appender.app.MaxBackupIndex=5
根据 Apache log4j 文档:如果记录到名为
file.log
的文件,当文件大小达到指定的大小限制时,内容将存档在名为 file.log.1
的文件中,并且 file.log
会被截断。当第二次达到大小限制时,file.log.1
被重命名为file.log.2
; file.log
中的内容将存档到 file.log.1
,并且 file.log
会被截断。
但是库更新后,内容会以串行方式存档:当第二次达到大小限制时,
file.log.1
不会重命名为file.log.2
;相反,file.log
中的内容会存档到 file.log.2
,并且 file.log
会被截断。
这显然是
log4j-1.2-api
中的一个错误(我将其报告为 apache/logging-log4j2#1650)。
编辑: 该错误已在版本
2.21.0
中修复。
已弃用的解决方法:
您可以通过切换到 Log4j 2.x 配置格式(参见 文档)并在
fileIndex="min"
上设置 DefaultRolloverStrategy
来解决此问题。
1.x 配置的 2.x 等效项将如下所示:
<RollingFile name="app"
fileName="${sys:applicationLogs}/app.log"
filePattern="${sys:applicationLogs}/app.log.%i">
<PatternLayout charset="UTF-8"
pattern="%d %-5p [%-4t] %c{1}.%M(%L) | %m%n"/>
<SizeBasedTriggeringPolicy size="10KB"/>
<DefaultRolloverStrategy fileIndex="min" max="5"/>
</RollingFile>