使用 Log4j 1.x 桥时,Log4j RollingFileAppender 有奇怪的行为
Log4j RollingFileAppender has odd behavior when using the Log4j 1.x bridge
当我迁移到 log4j2 时,我配置了我的 Tomcat Web 应用程序以使用
Log4j 1.x 桥。我在这里遵循了迁移指南:
https://logging.apache.org/log4j/2.x/manual/migration.html
我继续使用现有的 log4j.properties 文件,如下所示:
log4j.rootLogger=INFO, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/var/log/mylog.out
log4j.appender.file.MaxFileSize=10KB
log4j.appender.file.MaxBackupIndex=2
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ISO8601} %-5p %t %c - %m%n
这成功创建了我的日志文件并以 10KB 滚动。
我遇到了无法解释的问题。这是我日志中的文件
目录:
-rw-r----- 1 root root 7.6K Jan 10 12:27 test.log
-rw-r----- 1 root root 11K Jan 10 12:27 test.log.1
-rw-r----- 1 root root 36K Jan 10 12:27 test.log.2
-rw-r----- 1 root root 11K Jan 10 12:27 test.log2022-01-10
我得到一个以当天命名的日志文件。我已经试验过了,看起来
就像 RollingFileAppender 也在每天结束时滚动一样。它
在使用桥梁之前没有这样做。知道为什么会这样,以及
如何阻止它?
编辑:这是一个错误,在版本 2.17.2 中是 fixed。
这是一个错误,您应该报告它。 RollingFileAppenderBuilder
(参见 source code)有一个包含日期而不是数字的 filePattern
:
String filePattern = fileName +"%d{yyy-MM-dd}";
TriggeringPolicy timePolicy = TimeBasedTriggeringPolicy.newBuilder().setModulate(true).build();
SizeBasedTriggeringPolicy sizePolicy = SizeBasedTriggeringPolicy.createPolicy(maxSize);
CompositeTriggeringPolicy policy = CompositeTriggeringPolicy.createPolicy(sizePolicy, timePolicy);
RolloverStrategy strategy = DefaultRolloverStrategy.newBuilder()
.setConfig(config)
.setMax(maxBackups)
.build();
return new AppenderWrapper(RollingFileAppender.newBuilder()
.setName(name)
.setConfiguration(config)
.setLayout(fileLayout)
.setFilter(fileFilter)
.setBufferedIo(bufferedIo)
.setImmediateFlush(immediateFlush)
.setFileName(fileName)
.setFilePattern(filePattern)
.setPolicy(policy)
.setStrategy(strategy)
.build());
因此它的行为更像 DailyRollingFileAppender
,然后是 Log4j 1.x RollingFileAppender
.
作为解决方法,您可以通过设置这些系统属性来使用旧版 Log4j1ConfigurationFactory
:
log4j2.configurationFactory=org.apache.log4j.config.Log4j1ConfigurationFactory
log4j2.configurationFile=classpath:log4j.properties
当我迁移到 log4j2 时,我配置了我的 Tomcat Web 应用程序以使用 Log4j 1.x 桥。我在这里遵循了迁移指南: https://logging.apache.org/log4j/2.x/manual/migration.html
我继续使用现有的 log4j.properties 文件,如下所示:
log4j.rootLogger=INFO, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/var/log/mylog.out
log4j.appender.file.MaxFileSize=10KB
log4j.appender.file.MaxBackupIndex=2
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ISO8601} %-5p %t %c - %m%n
这成功创建了我的日志文件并以 10KB 滚动。
我遇到了无法解释的问题。这是我日志中的文件 目录:
-rw-r----- 1 root root 7.6K Jan 10 12:27 test.log
-rw-r----- 1 root root 11K Jan 10 12:27 test.log.1
-rw-r----- 1 root root 36K Jan 10 12:27 test.log.2
-rw-r----- 1 root root 11K Jan 10 12:27 test.log2022-01-10
我得到一个以当天命名的日志文件。我已经试验过了,看起来 就像 RollingFileAppender 也在每天结束时滚动一样。它 在使用桥梁之前没有这样做。知道为什么会这样,以及 如何阻止它?
编辑:这是一个错误,在版本 2.17.2 中是 fixed。
这是一个错误,您应该报告它。 RollingFileAppenderBuilder
(参见 source code)有一个包含日期而不是数字的 filePattern
:
String filePattern = fileName +"%d{yyy-MM-dd}";
TriggeringPolicy timePolicy = TimeBasedTriggeringPolicy.newBuilder().setModulate(true).build();
SizeBasedTriggeringPolicy sizePolicy = SizeBasedTriggeringPolicy.createPolicy(maxSize);
CompositeTriggeringPolicy policy = CompositeTriggeringPolicy.createPolicy(sizePolicy, timePolicy);
RolloverStrategy strategy = DefaultRolloverStrategy.newBuilder()
.setConfig(config)
.setMax(maxBackups)
.build();
return new AppenderWrapper(RollingFileAppender.newBuilder()
.setName(name)
.setConfiguration(config)
.setLayout(fileLayout)
.setFilter(fileFilter)
.setBufferedIo(bufferedIo)
.setImmediateFlush(immediateFlush)
.setFileName(fileName)
.setFilePattern(filePattern)
.setPolicy(policy)
.setStrategy(strategy)
.build());
因此它的行为更像 DailyRollingFileAppender
,然后是 Log4j 1.x RollingFileAppender
.
作为解决方法,您可以通过设置这些系统属性来使用旧版 Log4j1ConfigurationFactory
:
log4j2.configurationFactory=org.apache.log4j.config.Log4j1ConfigurationFactory
log4j2.configurationFile=classpath:log4j.properties