[ https://issues.apache.org/jira/browse/LOG4J2-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Carter Kozak resolved LOG4J2-2741. ---------------------------------- Fix Version/s: 2.13.1 Resolution: Duplicate > Log files are (sometimes) overwritten during rolling when using > CronTriggeringPolicy > ------------------------------------------------------------------------------------ > > Key: LOG4J2-2741 > URL: https://issues.apache.org/jira/browse/LOG4J2-2741 > Project: Log4j 2 > Issue Type: Bug > Components: Appenders > Affects Versions: 2.11.2 > Reporter: Andreas Huber > Assignee: Ralph Goers > Priority: Critical > Fix For: 2.13.1 > > Attachments: CronExpressionTest.java > > Time Spent: 10m > Remaining Estimate: 0h > > The {{CronTriggeringPolicy}} with a date pattern as file pattern may > overwrite previous log files during rolling. This happens randomly. An > example appender definition: > {noformat} > <RollingRandomAccessFile name="mylogfile" > fileName="mylogfile.log" > filePattern="mylogfile.%d{yyyy-MM-dd_HHmmss}.log.zip"> > <PatternLayout pattern="%d{ISO8601} %m%n" /> > <Policies> > <CronTriggeringPolicy schedule="0 0 0 * * ?"/><!-- triggers at > midnight --> > </Policies> > </RollingRandomAccessFile> > {noformat} > In the debug logging we can see that the "prev file time" is set the 17:11 > twice. > {noformat} > 2019-12-17T17:11:00,001 Log4j2-TF-3-Scheduled-8 DEBUG Setting prev file time > to 2019-12-17T17:11:00,000+0100 > 2019-12-17T17:12:00,000 Log4j2-TF-3-Scheduled-2 DEBUG Setting prev file time > to 2019-12-17T17:11:00,000+0100 > {noformat} > This bug is reproducible in 2.11.2, but not in 2.11.1. I believe it was > introduced with LOG4J2-2542 > ([https://gitbox.apache.org/repos/asf?p=logging-log4j2.git;a=commitdiff;h=42fe68e;hp=dfced487bdb422c56334922411e10447bdb64969]). > When we look at {{CronTriggeringPolicy.rollover()}}, then we see that in > <=2.11.1 the {{prevFileTime}} set on the {{PatternProcessor}} was based on > the {{lastRollDate}}. With 2.11.2 it is based on > {{CronExpression.getPrevFireTime(new Date())}}. The problem is that > {{CronExpression.getPrevFireTime()}} returns the wrong date if the method is > called with a date created a millisecond after the actual fire time. I > attached a simple test that demonstrates this (see > [^CronExpressionTest.java]). In other words if {{new Date()}} is called in > the same millisecond as the schedule was scheduled to run, then you get the > correct previous fire time. But if {{new Date()}} is called a millisecond too > late, then you get the wrong previous fire time. > My current workaround is to add {{%i}} to the file pattern, e.g. > {{mylogfile.%d\{yyyy-MM-dd_HHmmss}_%i.log.zip}}. That way no files are > overwritten and I do not lose log files. > I am not sure how to fix this without breaking the fix for LOG4J2-2542. At > first glance I see the following starting point for further investigation: > {{lastRollDate}} is private to {{CronTriggeringPolicy}}, but only the > {{RollingFileManager}} really knows when the file was last rolled. > {{CronTriggeringPolicy}} can never know that the log was already rolled by > another policy. And it will never know when the log is being rolled > concurrently in another thread. Therefore the {{lastRollDate}} cannot be > correctly determined in {{CronTriggeringPolicy}} and has to be part of the > {{RollingFileManager}}. > FYI, [~rgoers] -- This message was sent by Atlassian Jira (v8.3.4#803005)