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>
