滚动 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
旋转文件使用哪个日期很大程度上取决于触发策略:
SizeBasedTriggeringPolicy
and TimeBasedTriggeringPolicy
both update the prevFileTime
,当他们发出需要翻转的信号时。这发生在执行翻转之前,因此文件以 当前翻转 的日期结束,而不是前一个
-
CronTriggeringPolicy
实际上从来没有发出需要转期的信号(isTriggeringEvent
总是 returns false
),而是使用 [=] 的日期自行执行转期25=]上次翻转.
我个人觉得它有点不连贯,需要进行重大重构,但它是一个复杂的机制,很难做到正确。您可能应该提交一份 bug/wishlist 报告。
TL;DR: 使用 CronTriggeringPolicy
.
使用 OnStartupTriggeringPolicy 时,先前的文件时间变量不会随着新文件的创建而更新。这不是 OnStartupTriggering 策略行为的问题,而是在手动翻转期间打印在备份日志文件上的当前时间。此行为应在 log4j 中修复,但可以在应用程序级别执行以下变通方法来修复此问题,直到 log4j 问题得到修复。
RollingFileManager rollingFileManager = ((RollingFileAppender) appender).getManager();
long currentLogCreationTime = rollingFileManager.getFileTime();
rollingFileManager.getPatternProcessor().setPrevFileTime(currentLogCreationTime);
rollingFileManager.rollover();
我想在更新后的文件名中包含旧日志文件的创建日期。当前日志文件名中的日期不等于文件的创建日期。 举个例子:如果一个日志文件是昨天创建的,更新到今天,现在滚动,昨天的日期应该在旧日志文件名中可见。
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
旋转文件使用哪个日期很大程度上取决于触发策略:
SizeBasedTriggeringPolicy
andTimeBasedTriggeringPolicy
both update theprevFileTime
,当他们发出需要翻转的信号时。这发生在执行翻转之前,因此文件以 当前翻转 的日期结束,而不是前一个-
CronTriggeringPolicy
实际上从来没有发出需要转期的信号(isTriggeringEvent
总是 returnsfalse
),而是使用 [=] 的日期自行执行转期25=]上次翻转.
我个人觉得它有点不连贯,需要进行重大重构,但它是一个复杂的机制,很难做到正确。您可能应该提交一份 bug/wishlist 报告。
TL;DR: 使用 CronTriggeringPolicy
.
使用 OnStartupTriggeringPolicy 时,先前的文件时间变量不会随着新文件的创建而更新。这不是 OnStartupTriggering 策略行为的问题,而是在手动翻转期间打印在备份日志文件上的当前时间。此行为应在 log4j 中修复,但可以在应用程序级别执行以下变通方法来修复此问题,直到 log4j 问题得到修复。
RollingFileManager rollingFileManager = ((RollingFileAppender) appender).getManager();
long currentLogCreationTime = rollingFileManager.getFileTime();
rollingFileManager.getPatternProcessor().setPrevFileTime(currentLogCreationTime);
rollingFileManager.rollover();