滚动 log4j 时如何在旧日志文件名中使用文件创建日期

How to use file creation date in old log file name when rolled over log4j

我想在更新后的文件名中包含旧日志文件的创建日期。当前日志文件名中的日期不等于文件的创建日期。 举个例子:如果一个日志文件是昨天创建的,更新到今天,现在滚动,昨天的日期应该在旧日志文件名中可见。

log4j 版本为 2.14.1

log4j2.xml

    <Appenders>
        <RollingFile name="RollingFile"
                     fileName="${sys:dir}/${sys:file}.log"
                     immediateFlush="true"
                     filePattern="${sys:dir}/${sys:file}.log.%d{yyyy_MM_dd.HH_mm_ss}.%i"
                     ignoreExceptions="false">
            <PatternLayout pattern="%d{yyyyMMdd-HHmmss.SSS} |%-5p| [%t] [%c] - %-100m %n"/>
            <Policies>
                <OnStartupTriggeringPolicy/>
            </Policies>
        </RollingFile> 
    </Appenders>

启动后的日志切换如下代码里面

((RollingFileAppender) appender).getManager().rollover();

这类似于以下错误,但未针对 OnStartupTriggeringPolicy 修复
File creationTime issue for RollingFileAppender, combined time/size policy

旋转文件使用哪个日期很大程度上取决于触发策略:

我个人觉得它有点不连贯,需要进行重大重构,但它是一个复杂的机制,很难做到正确。您可能应该提交一份 bug/wishlist 报告。

TL;DR: 使用 CronTriggeringPolicy.

使用 OnStartupTriggeringPolicy 时,先前的文件时间变量不会随着新文件的创建而更新。这不是 OnStartupTriggering 策略行为的问题,而是在手动翻转期间打印在备份日志文件上的当前时间。此行为应在 log4j 中修复,但可以在应用程序级别执行以下变通方法来修复此问题,直到 log4j 问题得到修复。

  RollingFileManager rollingFileManager = ((RollingFileAppender) appender).getManager();                
  long currentLogCreationTime = rollingFileManager.getFileTime();
  rollingFileManager.getPatternProcessor().setPrevFileTime(currentLogCreationTime);
  rollingFileManager.rollover();