diff --git a/CronTriggeringPolicy.java b/CronTriggeringPolicy_patched.java index 6b8af2a..f9bd1c0 100644 --- a/CronTriggeringPolicy.java +++ b/CronTriggeringPolicy_patched.java @@ -16,8 +16,11 @@ */ package org.apache.logging.log4j.core.appender.rolling; +import static com.cronutils.model.CronType.QUARTZ; + import java.text.ParseException; -import java.util.Calendar; +import java.time.Instant; +import java.time.ZoneId; import java.util.Date; import java.util.concurrent.TimeUnit; @@ -31,6 +34,10 @@ import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; import org.apache.logging.log4j.core.config.plugins.PluginFactory; import org.apache.logging.log4j.core.util.CronExpression; +import com.cronutils.model.definition.CronDefinitionBuilder; +import com.cronutils.model.time.ExecutionTime; +import com.cronutils.parser.CronParser; + /** * Rolls a file over based on a cron schedule. */ @@ -43,7 +50,7 @@ public final class CronTriggeringPolicy extends AbstractTriggeringPolicy { private final CronExpression cronExpression; private final Configuration configuration; private final boolean checkOnStartup; - private volatile Date nextRollDate; + private volatile Date lastRollDate; private CronScheduledFuture future; private CronTriggeringPolicy(final CronExpression schedule, final boolean checkOnStartup, @@ -62,14 +69,22 @@ public final class CronTriggeringPolicy extends AbstractTriggeringPolicy { @Override public void initialize(final RollingFileManager aManager) { this.manager = aManager; - final Date nextDate = new Date(this.manager.getFileTime()); - nextRollDate = cronExpression.getNextValidTimeAfter(nextDate); - if (checkOnStartup) { - if (nextRollDate.getTime() < System.currentTimeMillis()) { - rollover(); - } + + final Date now = new Date(); + final ExecutionTime executionTime = ExecutionTime.forCron( + new CronParser(CronDefinitionBuilder.instanceDefinitionFor(QUARTZ)).parse(cronExpression.getCronExpression())); + final Instant lastRollForFile = + executionTime.lastExecution(new Date(manager.getFileTime()).toInstant().atZone(ZoneId.systemDefault())).toInstant(); + final Instant lastRegularRoll = + executionTime.lastExecution(now.toInstant().atZone(ZoneId.systemDefault())).toInstant(); + + if (checkOnStartup && lastRollForFile.isBefore(lastRegularRoll)) { + lastRollDate = Date.from(lastRollForFile); + rollover(); } - future = configuration.getScheduler().scheduleWithCron(cronExpression, new CronTrigger()); + + lastRollDate = Date.from(lastRegularRoll); + future = configuration.getScheduler().scheduleWithCron(cronExpression, now, new CronTrigger()); } /** @@ -128,13 +143,12 @@ public final class CronTriggeringPolicy extends AbstractTriggeringPolicy { } private void rollover() { - manager.getPatternProcessor().setPrevFileTime(nextRollDate.getTime()); + manager.getPatternProcessor().setPrevFileTime(lastRollDate.getTime()); manager.rollover(); - final Date fireDate = future.getFireTime(); - final Calendar cal = Calendar.getInstance(); - cal.setTime(fireDate); - cal.add(Calendar.SECOND, -1); - nextRollDate = cal.getTime(); + if (future != null) + { + lastRollDate = future.getFireTime(); + } } @Override