使用 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