Repository: logging-log4j2
Updated Branches:
  refs/heads/master b0b4f8659 -> 730a1cc7c


LOG4J2-1250 - CronTriggeringPolicy was not properly setting the prevFileTime 
value for the PatternProcessor so file dates and times on rolled over files 
were incorrect. Also fixed CleanFiles error where it was failing even though a 
subsequent loop iteration deleted the files


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/730a1cc7
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/730a1cc7
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/730a1cc7

Branch: refs/heads/master
Commit: 730a1cc7cc99f9e08cc8dd4a3c3e31ffc3a20f0f
Parents: b0b4f86
Author: Ralph Goers <[email protected]>
Authored: Mon Jul 4 06:57:14 2016 -0700
Committer: Ralph Goers <[email protected]>
Committed: Mon Jul 4 06:57:14 2016 -0700

----------------------------------------------------------------------
 .../appender/rolling/CronTriggeringPolicy.java  | 37 ++++++++++++-----
 .../core/appender/rolling/PatternProcessor.java | 12 +++++-
 .../appender/rolling/RollingFileManager.java    |  1 +
 .../rolling/action/CommonsCompressAction.java   |  9 +++-
 .../core/config/ConfigurationScheduler.java     | 24 ++++++-----
 .../log4j/core/config/CronScheduledFuture.java  | 43 ++++++++++++++------
 .../rolling/OnStartupTriggeringPolicyTest.java  | 23 +++++++----
 .../rolling/RollingAppenderCronTest.java        |  5 +++
 .../rolling/RollingAppenderSizeTest.java        |  6 +++
 .../logging/log4j/junit/CleanFolders.java       | 28 +++++++++----
 src/changes/changes.xml                         |  4 ++
 11 files changed, 137 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/730a1cc7/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
index 863ea9d..fb7e084 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
@@ -16,9 +16,14 @@
  */
 package org.apache.logging.log4j.core.appender.rolling;
 
+import java.text.ParseException;
+import java.util.Calendar;
+import java.util.Date;
+
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.CronScheduledFuture;
 import org.apache.logging.log4j.core.config.Scheduled;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
@@ -27,9 +32,6 @@ import 
org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.core.util.CronExpression;
 import org.apache.logging.log4j.status.StatusLogger;
 
-import java.text.ParseException;
-import java.util.Date;
-
 /**
  * Rolls a file over based on a cron schedule.
  */
@@ -37,14 +39,17 @@ import java.util.Date;
 @Scheduled
 public final class CronTriggeringPolicy implements TriggeringPolicy {
 
-    private static Logger LOGGER = StatusLogger.getLogger();
+    private static final Logger LOGGER = StatusLogger.getLogger();
     private static final String defaultSchedule = "0 0 0 * * ?";
     private RollingFileManager manager;
     private final CronExpression cronExpression;
     private final Configuration configuration;
     private final boolean checkOnStartup;
+    private volatile Date nextRollDate;
+    private CronScheduledFuture future;
 
-    private CronTriggeringPolicy(final CronExpression schedule, final boolean 
checkOnStartup, final Configuration configuration) {
+    private CronTriggeringPolicy(final CronExpression schedule, final boolean 
checkOnStartup,
+            final Configuration configuration) {
         this.cronExpression = schedule;
         this.configuration = configuration;
         this.checkOnStartup = checkOnStartup;
@@ -57,13 +62,14 @@ public final class CronTriggeringPolicy implements 
TriggeringPolicy {
     @Override
     public void initialize(final RollingFileManager aManager) {
         this.manager = aManager;
+        final Date nextDate = new Date(this.manager.getFileTime());
+        nextRollDate = cronExpression.getNextValidTimeAfter(nextDate);
         if (checkOnStartup) {
-            final Date nextDate = cronExpression.getNextValidTimeAfter(new 
Date(this.manager.getFileTime()));
-            if (nextDate.getTime() < System.currentTimeMillis()) {
-                manager.rollover();
+            if (nextRollDate.getTime() < System.currentTimeMillis()) {
+                rollover();
             }
         }
-        configuration.getScheduler().scheduleWithCron(cronExpression, new 
CronTrigger());
+        future = configuration.getScheduler().scheduleWithCron(cronExpression, 
new CronTrigger());
     }
 
     /**
@@ -116,6 +122,16 @@ public final class CronTriggeringPolicy implements 
TriggeringPolicy {
         }
     }
 
+    private void rollover() {
+        manager.getPatternProcessor().setPrevFileTime(nextRollDate.getTime());
+        manager.rollover();
+        final Date fireDate = future.getFireTime();
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(fireDate);
+        cal.add(Calendar.SECOND, -1);
+        nextRollDate = cal.getTime();
+    }
+
     @Override
     public String toString() {
         return "CronTriggeringPolicy(schedule=" + 
cronExpression.getCronExpression() + ")";
@@ -125,8 +141,7 @@ public final class CronTriggeringPolicy implements 
TriggeringPolicy {
 
         @Override
         public void run() {
-            manager.rollover();
+            rollover();
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/730a1cc7/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java
index 0dee11e..ba7934e 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java
@@ -57,7 +57,7 @@ public class PatternProcessor {
     private long nextFileTime = 0;
 
     private RolloverFrequency frequency = null;
-    
+
     private final String pattern;
 
     public String getPattern() {
@@ -92,6 +92,14 @@ public class PatternProcessor {
         }
     }
 
+    public long getPrevFileTime() {
+        return prevFileTime;
+    }
+
+    public void setPrevFileTime(long prevFileTime) {
+        this.prevFileTime = prevFileTime;
+    }
+
     /**
      * Returns the next potential rollover time.
      * @param currentMillis The current time.
@@ -220,7 +228,7 @@ public class PatternProcessor {
      */
     public final void formatFileName(final StrSubstitutor subst, final 
StringBuilder buf, final Object obj) {
         // LOG4J2-628: we deliberately use System time, not the log4j.Clock 
time
-        // for creating the file name of rolled-over files. 
+        // for creating the file name of rolled-over files.
         final long time = prevFileTime == 0 ? System.currentTimeMillis() : 
prevFileTime;
         formatFileName(buf, new Date(time), obj);
         final LogEvent event = new 
Log4jLogEvent.Builder().setTimeMillis(time).build();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/730a1cc7/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
index 9b721bc..f92a9b7 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
@@ -75,6 +75,7 @@ public class RollingFileManager extends FileManager {
         this.triggeringPolicy = triggeringPolicy;
         this.rolloverStrategy = rolloverStrategy;
         this.patternProcessor = new PatternProcessor(pattern);
+        this.patternProcessor.setPrevFileTime(time);
     }
 
     public void initialize() {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/730a1cc7/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/CommonsCompressAction.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/CommonsCompressAction.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/CommonsCompressAction.java
index de1fed0..d80287f 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/CommonsCompressAction.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/CommonsCompressAction.java
@@ -56,7 +56,7 @@ public final class CommonsCompressAction extends 
AbstractAction {
 
     /**
      * Creates new instance of Bzip2CompressAction.
-     * 
+     *
      * @param name the compressor name. One of "gz", "bzip2", "xz", "pack200", 
or "deflate".
      * @param source file to compress, may not be null.
      * @param destination compressed file, may not be null.
@@ -86,7 +86,7 @@ public final class CommonsCompressAction extends 
AbstractAction {
 
     /**
      * Compresses a file.
-     * 
+     *
      * @param name the compressor name, i.e. "gz", "bzip2", "xz", "pack200", 
or "deflate".
      * @param source file to compress, may not be null.
      * @param destination compressed file, may not be null.
@@ -101,6 +101,7 @@ public final class CommonsCompressAction extends 
AbstractAction {
         if (!source.exists()) {
             return false;
         }
+        LOGGER.debug("Starting {} compression of {}", name, source.getPath() );
         try (final FileInputStream input = new FileInputStream(source);
                 final BufferedOutputStream output = new BufferedOutputStream(
                         new 
CompressorStreamFactory().createCompressorOutputStream(name, new 
FileOutputStream(
@@ -108,10 +109,14 @@ public final class CommonsCompressAction extends 
AbstractAction {
             IOUtils.copy(input, output, BUF_SIZE);
         } catch (final CompressorException e) {
             throw new IOException(e);
+        } finally {
+            LOGGER.debug("Finished {} compression of {}", name, 
source.getPath() );
         }
 
         if (deleteSource && !source.delete()) {
             LOGGER.warn("Unable to delete " + source.toString() + '.');
+        } else {
+            LOGGER.debug("Deleted {}", source.toString());
         }
         return true;
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/730a1cc7/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java
index 3364ca4..6a3c1ec 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java
@@ -115,9 +115,10 @@ public class ConfigurationScheduler extends 
AbstractLifeCycle {
      * @return a ScheduledFuture representing the next time the command will 
run.
      */
     public CronScheduledFuture<?> scheduleWithCron(final CronExpression 
cronExpression, final Runnable command) {
+        Date fireDate = cronExpression.getNextValidTimeAfter(new Date());
         final CronRunnable runnable = new CronRunnable(command, 
cronExpression);
-        final ScheduledFuture<?> future = schedule(runnable, 
nextFireInterval(cronExpression), TimeUnit.MILLISECONDS);
-        final CronScheduledFuture<?> cronScheduledFuture = new 
CronScheduledFuture<>(future);
+        final ScheduledFuture<?> future = schedule(runnable, 
nextFireInterval(fireDate), TimeUnit.MILLISECONDS);
+        final CronScheduledFuture<?> cronScheduledFuture = new 
CronScheduledFuture<>(future, fireDate);
         runnable.setScheduledFuture(cronScheduledFuture);
         return cronScheduledFuture;
     }
@@ -152,7 +153,11 @@ public class ConfigurationScheduler extends 
AbstractLifeCycle {
         return executorService.scheduleWithFixedDelay(command, initialDelay, 
delay, unit);
     }
 
-    private class CronRunnable implements Runnable {
+    public long nextFireInterval(Date fireDate) {
+        return fireDate.getTime() - new Date().getTime();
+    }
+
+    public class CronRunnable implements Runnable {
 
         private final CronExpression cronExpression;
         private final Runnable runnable;
@@ -167,6 +172,8 @@ public class ConfigurationScheduler extends 
AbstractLifeCycle {
             this.scheduledFuture = future;
         }
 
+
+
         @Override
         public void run() {
             try {
@@ -174,16 +181,11 @@ public class ConfigurationScheduler extends 
AbstractLifeCycle {
             } catch(final Throwable ex) {
                 LOGGER.error("Error running command", ex);
             } finally {
-                final ScheduledFuture<?> future = schedule(this, 
nextFireInterval(cronExpression), TimeUnit.MILLISECONDS);
-                scheduledFuture.setScheduledFuture(future);
+                Date fireDate = cronExpression.getNextInvalidTimeAfter(new 
Date());
+                final ScheduledFuture<?> future = schedule(this, 
nextFireInterval(fireDate), TimeUnit.MILLISECONDS);
+                scheduledFuture.reset(future, fireDate);
             }
         }
     }
 
-    private long nextFireInterval(final CronExpression cronExpression) {
-        final Date now = new Date();
-        final Date fireDate = cronExpression.getNextValidTimeAfter(now);
-        return fireDate.getTime() - now.getTime();
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/730a1cc7/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CronScheduledFuture.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CronScheduledFuture.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CronScheduledFuture.java
index a684dcb..948c23b 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CronScheduledFuture.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CronScheduledFuture.java
@@ -16,6 +16,7 @@
  */
 package org.apache.logging.log4j.core.config;
 
+import java.util.Date;
 import java.util.concurrent.Delayed;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ScheduledFuture;
@@ -27,50 +28,66 @@ import java.util.concurrent.TimeoutException;
  */
 public class CronScheduledFuture<V> implements ScheduledFuture<V> {
 
-    private volatile ScheduledFuture<?> scheduledFuture;
+    private volatile FutureData futureData;
 
-    public CronScheduledFuture(final ScheduledFuture<V> future) {
-        this.scheduledFuture = future;
+    public CronScheduledFuture(final ScheduledFuture<V> future, final Date 
runDate) {
+        this.futureData = new FutureData(future, runDate);
     }
 
-    void setScheduledFuture(final ScheduledFuture<?> future) {
-        this.scheduledFuture = future;
+    public Date getFireTime() {
+        return futureData.runDate;
+    }
+
+    void reset(final ScheduledFuture<?> future, final Date runDate) {
+        futureData = new FutureData(future, runDate);
     }
 
     @Override
     public long getDelay(final TimeUnit unit) {
-        return scheduledFuture.getDelay(unit);
+        return futureData.scheduledFuture.getDelay(unit);
     }
 
     @Override
     public int compareTo(final Delayed delayed) {
-        return scheduledFuture.compareTo(delayed);
+        return futureData.scheduledFuture.compareTo(delayed);
     }
 
     @Override
     public boolean cancel(final boolean mayInterruptIfRunning) {
-        return scheduledFuture.cancel(mayInterruptIfRunning);
+        return futureData.scheduledFuture.cancel(mayInterruptIfRunning);
     }
 
     @Override
     public boolean isCancelled() {
-        return scheduledFuture.isCancelled();
+        return futureData.scheduledFuture.isCancelled();
     }
 
     @Override
     public boolean isDone() {
-        return scheduledFuture.isDone();
+        return futureData.scheduledFuture.isDone();
     }
 
     @Override
     @SuppressWarnings("unchecked")
     public V get() throws InterruptedException, ExecutionException {
-        return (V) scheduledFuture.get();
+        return (V) futureData.scheduledFuture.get();
     }
 
     @Override
     @SuppressWarnings("unchecked")
-    public V get(final long timeout, final TimeUnit unit) throws 
InterruptedException, ExecutionException, TimeoutException {
-        return (V) scheduledFuture.get(timeout, unit);
+    public V get(final long timeout, final TimeUnit unit)
+            throws InterruptedException, ExecutionException, TimeoutException {
+        return (V) futureData.scheduledFuture.get(timeout, unit);
+    }
+
+    private class FutureData {
+
+        private final ScheduledFuture<?> scheduledFuture;
+        private final Date runDate;
+
+        FutureData(ScheduledFuture<?> future, Date runDate) {
+            this.scheduledFuture = future;
+            this.runDate = runDate;
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/730a1cc7/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
index 61daa9a..728ad81 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
@@ -27,6 +27,7 @@ import java.nio.file.Paths;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.DefaultConfiguration;
 import org.apache.logging.log4j.core.layout.PatternLayout;
+import org.apache.logging.log4j.core.util.datetime.FastDateFormat;
 import org.apache.logging.log4j.junit.CleanFiles;
 import org.junit.Rule;
 import org.junit.Test;
@@ -36,25 +37,31 @@ import org.junit.Test;
  */
 public class OnStartupTriggeringPolicyTest {
 
-    private static final String TARGET_FILE = "target/testfile";
-    private static final String TARGET_PATTERN = 
"target/rolling1/test1-%i.log";
-    private static final String ROLLED_FILE = "target/rolling1/test1-1.log";
+    private static final String TARGET_FILE = "target/rollOnStartup/testfile";
+    private static final String TARGET_PATTERN = 
"target/rollOnStartup/test1-%d{MM-dd-yyyy}-%i.log";
+    private static final String ROLLED_FILE_PREFIX = 
"target/rollOnStartup/test1-";
+    private static final String ROLLED_FILE_SUFFIX = "-1.log";
     private static final String TEST_DATA = "Hello world!";
+    private static final FastDateFormat formatter = 
FastDateFormat.getInstance("MM-dd-yyyy");
+
+    //@Rule
+    //public CleanFiles rule = new CleanFolders("target/rollOnStartup");
 
-    @Rule
-    public CleanFiles rule = new CleanFiles(TARGET_FILE, ROLLED_FILE);
-    
     @Test
     public void testPolicy() throws Exception {
         final Configuration configuration = new DefaultConfiguration();
         final Path target = Paths.get(TARGET_FILE);
-        final Path rolled = Paths.get(ROLLED_FILE);
+        target.toFile().getParentFile().mkdirs();
+        final long timeStamp = System.currentTimeMillis() - (1000 * 60 * 60 * 
24);
+        final String expectedDate = formatter.format(timeStamp);
+        final String rolledFileName = ROLLED_FILE_PREFIX + expectedDate + 
ROLLED_FILE_SUFFIX;
+        final Path rolled = Paths.get(rolledFileName);
         try (final InputStream is = new 
ByteArrayInputStream(TEST_DATA.getBytes("UTF-8"))) {
             Files.copy(is, target);
         }
         final long size = Files.size(target);
         assertTrue(size > 0);
-        long timeStamp = System.currentTimeMillis() - 120000;
+
         target.toFile().setLastModified(timeStamp);
         final PatternLayout layout = 
PatternLayout.newBuilder().withPattern("%msg").withConfiguration(configuration)
                 .build();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/730a1cc7/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderCronTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderCronTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderCronTest.java
index 6c3e566..164e5f2 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderCronTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderCronTest.java
@@ -34,6 +34,7 @@ import java.nio.file.Path;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.appender.RollingFileAppender;
 import org.apache.logging.log4j.core.util.CronExpression;
+import org.apache.logging.log4j.core.util.datetime.FastDateFormat;
 import org.apache.logging.log4j.junit.LoggerContextRule;
 import org.hamcrest.Matcher;
 import org.junit.Rule;
@@ -47,6 +48,8 @@ public class RollingAppenderCronTest {
 
     private static final String CONFIG = "log4j-rolling-cron.xml";
     private static final String DIR = "target/rolling-cron";
+    private static final String FILE = "target/rolling-cron/rollingtest.log";
+    private static final FastDateFormat formatter = 
FastDateFormat.getInstance("MM-dd-yy-HH-mm-ss");
 
     private final LoggerContextRule loggerContextRule = new 
LoggerContextRule(CONFIG);
 
@@ -56,6 +59,8 @@ public class RollingAppenderCronTest {
     @Test
     public void testAppender() throws Exception {
         final Logger logger = loggerContextRule.getLogger();
+        File file = new File(FILE);
+        assertTrue("Log file does not exist", file.exists());
         logger.debug("This is test message number 1");
         Thread.sleep(2500);
         final File dir = new File(DIR);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/730a1cc7/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderSizeTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderSizeTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderSizeTest.java
index d9d46e4..92e89b1 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderSizeTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderSizeTest.java
@@ -94,6 +94,12 @@ public class RollingAppenderSizeTest {
         for (int i = 0; i < 100; ++i) {
             logger.debug("This is test message number " + i);
         }
+        try {
+            Thread.sleep(100);
+        } catch (InterruptedException ie) {
+            // Ignore the error.
+        }
+
         final File dir = new File(DIR);
         assertTrue("Directory not created", dir.exists() && 
dir.listFiles().length > 0);
         final File[] files = dir.listFiles();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/730a1cc7/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java 
b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
index 95a8ef5..a3c84c0 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
@@ -23,6 +23,8 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.SimpleFileVisitor;
 import java.nio.file.attribute.BasicFileAttributes;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.junit.Assert;
 
@@ -50,25 +52,36 @@ public class CleanFolders extends 
AbstractExternalFileCleaner {
 
     @Override
     protected void clean() {
-        IOException lastEx = null;
-        Path lastPath = null;
+        Map<Path, IOException> failures = new HashMap<>();
+
         for (final File folder : getFiles()) {
             final Path path = folder.toPath();
             for (int i = 0; i < MAX_TRIES; i++) {
                 try {
                     cleanFolder(path);
+                    if (failures.containsKey(path)) {
+                        failures.remove(path);
+                    }
                     // break from MAX_TRIES and goes to the next folder
                     break;
                 } catch (final IOException e) {
                     // We will try again.
-                    lastEx = e;
-                    lastPath = path;
+                    failures.put(path, e);
                 }
             }
         }
-        if (lastEx != null) {
-            lastEx.printStackTrace();
-            Assert.fail(lastPath + ": " + lastEx);
+        if (failures.size() > 0) {
+            StringBuilder sb = new StringBuilder();
+            boolean first = true;
+            for (Map.Entry<Path, IOException> failure : failures.entrySet()) {
+                failure.getValue().printStackTrace();
+                if (!first) {
+                    sb.append(", ");
+                }
+                sb.append(failure.getKey()).append(" failed with 
").append(failure.getValue());
+                first = false;
+            }
+            Assert.fail(sb.toString());
         }
     }
 
@@ -89,5 +102,4 @@ public class CleanFolders extends 
AbstractExternalFileCleaner {
             });
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/730a1cc7/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 0615354..3641c0a 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -24,6 +24,10 @@
   </properties>
   <body>
     <release version="2.6.2" date="2016-MM-DD" description="GA Release 2.6.2">
+      <action issue="LOG4J2-1250" dev="rgoers">
+        CronTriggeringPolicy was not properly setting the prevFileTime value 
for the PatternProcessor so
+        file dates and times on rolled files were incorrect.
+      </action>
       <action issue="LOG4J2-1452" dev="rpopma" due-to="Mikael Ståldal">
         Fixed issue where reusable messages broke flow tracing logic.
       </action>

Reply via email to