This is an automated email from the ASF dual-hosted git repository.

rgoers pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/release-2.x by this push:
     new e392c79  LOG4J2-1906 Second attempt at a fix
e392c79 is described below

commit e392c79274ab5cd545d59d7e8fa3b744c7367d16
Author: Ralph Goers <rgo...@apache.org>
AuthorDate: Wed Nov 28 06:32:46 2018 -0700

    LOG4J2-1906 Second attempt at a fix
---
 .../rolling/DirectWriteRolloverStrategy.java       |  3 +--
 .../rolling/OnStartupTriggeringPolicy.java         |  1 +
 .../core/appender/rolling/PatternProcessor.java    |  6 ++---
 .../core/appender/rolling/RollingFileManager.java  | 27 +++++++++++++++++++++-
 .../rolling/TimeBasedTriggeringPolicy.java         |  8 +++++--
 .../rolling/OnStartupTriggeringPolicyTest.java     |  4 +++-
 ...ava => RollingAppenderDirectWrite1906Test.java} |  9 ++++----
 ...rect-1903.xml => log4j-rolling-direct-1906.xml} |  4 ++--
 8 files changed, 46 insertions(+), 16 deletions(-)

diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java
index 658c67f..530b3a9 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java
@@ -316,8 +316,7 @@ public class DirectWriteRolloverStrategy extends 
AbstractRolloverStrategy implem
             final SortedMap<Integer, Path> eligibleFiles = 
getEligibleFiles(manager);
             final int fileIndex = eligibleFiles.size() > 0 ? (nextIndex > 0 ? 
nextIndex : eligibleFiles.size()) : 1;
             final StringBuilder buf = new StringBuilder(255);
-            manager.getPatternProcessor().formatFileName(strSubstitutor, buf, 
true, usePrevTime, fileIndex);
-            usePrevTime = true;
+            manager.getPatternProcessor().formatFileName(strSubstitutor, buf, 
true, fileIndex);
             final int suffixLength = suffixLength(buf.toString());
             final String name = suffixLength > 0 ? buf.substring(0, 
buf.length() - suffixLength) : buf.toString();
             currentFileName = name;
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
index 4c8ae1c..77b673a 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
@@ -76,6 +76,7 @@ public class OnStartupTriggeringPolicy extends 
AbstractTriggeringPolicy {
     @Override
     public void initialize(final RollingFileManager manager) {
         if (manager.getFileTime() < JVM_START_TIME && manager.getFileSize() >= 
minSize) {
+            StatusLogger.getLogger().debug("Initiating rollover at startup");
             if (minSize == 0) {
                 manager.setRenameEmptyFiles(true);
             }
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 0d41f00..b5a5aa3 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
@@ -253,7 +253,7 @@ public class PatternProcessor {
      * @param obj object to be evaluated in formatting, may not be null.
      */
     public final void formatFileName(final StrSubstitutor subst, final 
StringBuilder buf, final Object obj) {
-        formatFileName(subst, buf, false, false, obj);
+        formatFileName(subst, buf, false, obj);
     }
 
     /**
@@ -263,11 +263,11 @@ public class PatternProcessor {
      * @param obj object to be evaluated in formatting, may not be null.
      */
     public final void formatFileName(final StrSubstitutor subst, final 
StringBuilder buf, final boolean useCurrentTime,
-                                     final boolean usePrevTime, final Object 
obj) {
+                                     final Object obj) {
         // LOG4J2-628: we deliberately use System time, not the log4j.Clock 
time
         // for creating the file name of rolled-over files.
         final long time = useCurrentTime && currentFileTime != 0 ? 
currentFileTime :
-                usePrevTime && prevFileTime != 0 ? prevFileTime : 
System.currentTimeMillis();
+                prevFileTime != 0 ? prevFileTime : System.currentTimeMillis();
         formatFileName(buf, new Date(time), obj);
         final LogEvent event = new 
Log4jLogEvent.Builder().setTimeMillis(time).build();
         final String fileName = subst.replace(event, buf);
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 87d2cb5..23ada53 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
@@ -22,6 +22,12 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.io.Serializable;
 import java.nio.ByteBuffer;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.attribute.FileTime;
+import java.time.Instant;
+import java.time.ZoneId;
 import java.util.Collection;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.ExecutorService;
@@ -53,6 +59,7 @@ public class RollingFileManager extends FileManager {
     private static RollingFileManagerFactory factory = new 
RollingFileManagerFactory();
     private static final int MAX_TRIES = 3;
     private static final int MIN_DURATION = 100;
+    private static final FileTime EPOCH = FileTime.fromMillis(0);
 
     protected long size;
     private long initialTime;
@@ -640,7 +647,7 @@ public class RollingFileManager extends FileManager {
                 final OutputStream os = data.createOnDemand  || data.fileName 
== null ? null :
                         new FileOutputStream(data.fileName, data.append);
                 final long time = data.createOnDemand || file == null ?
-                        System.currentTimeMillis() : file.lastModified(); // 
LOG4J2-531 create file first so time has valid value
+                        0 : initialFileTime(file); // LOG4J2-531 create file 
first so time has valid value
 
                 final RollingFileManager rm = new 
RollingFileManager(data.getLoggerContext(), data.fileName, data.pattern, os,
                     data.append, data.createOnDemand, size, time, data.policy, 
data.strategy, data.advertiseURI,
@@ -657,6 +664,24 @@ public class RollingFileManager extends FileManager {
         }
     }
 
+    private static long initialFileTime(File file) {
+        Path path = file.toPath();
+        if (Files.exists(path)) {
+            try {
+                BasicFileAttributes attrs = Files.readAttributes(path, 
BasicFileAttributes.class);
+                FileTime fileTime = attrs.creationTime();
+                if (fileTime.compareTo(EPOCH) > 0) {
+                    return fileTime.toMillis();
+                } else {
+                    LOGGER.info("Unable to obtain file creation time for " + 
file.getAbsolutePath());
+                }
+            } catch (Exception ex) {
+                LOGGER.info("Unable to calculate file creation time for " + 
file.getAbsolutePath() + ": " + ex.getMessage());
+            }
+        }
+        return file.lastModified();
+    }
+
     private static class EmptyQueue extends ArrayBlockingQueue<Runnable> {
 
         /**
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
index 3201429..d53b58a 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
@@ -108,12 +108,16 @@ public final class TimeBasedTriggeringPolicy extends 
AbstractTriggeringPolicy {
     @Override
     public void initialize(final RollingFileManager aManager) {
         this.manager = aManager;
+        long current = aManager.getFileTime();
+        if (current == 0) {
+            current = System.currentTimeMillis();
+        }
 
         // LOG4J2-531: call getNextTime twice to force initialization of both 
prevFileTime and nextFileTime
-        aManager.getPatternProcessor().getNextTime(aManager.getFileTime(), 
interval, modulate);
+        aManager.getPatternProcessor().getNextTime(current, interval, 
modulate);
 
         nextRolloverMillis = ThreadLocalRandom.current().nextLong(0, 1 + 
maxRandomDelayMillis)
-                + 
aManager.getPatternProcessor().getNextTime(aManager.getFileTime(), interval, 
modulate);
+                + aManager.getPatternProcessor().getNextTime(current, 
interval, modulate);
     }
 
     /**
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 7a3c5ca..72ae6f0 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
@@ -56,11 +56,13 @@ public class OnStartupTriggeringPolicyTest {
 
     @Test
     public void testPolicy() throws Exception {
+        //System.setProperty("log4j2.debug", "true");
+        //System.setProperty("log4j2.StatusLogger.level", "trace");
         final Configuration configuration = new DefaultConfiguration();
         final Path target = Paths.get(TARGET_FILE);
         Assert.assertFalse(Files.exists(target));
         target.toFile().getParentFile().mkdirs();
-        final long timeStamp = System.currentTimeMillis();
+        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);
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWrite1903Test.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWrite1906Test.java
similarity index 96%
rename from 
log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWrite1903Test.java
rename to 
log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWrite1906Test.java
index 4855725..64ab892 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWrite1903Test.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWrite1906Test.java
@@ -18,7 +18,6 @@ package org.apache.logging.log4j.core.appender.rolling;
 
 import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileReader;
 
 import org.apache.logging.log4j.Logger;
@@ -40,11 +39,11 @@ import static org.junit.Assert.assertEquals;
 /**
  *
  */
-public class RollingAppenderDirectWrite1903Test {
+public class RollingAppenderDirectWrite1906Test {
 
-    private static final String CONFIG = "log4j-rolling-direct-1903.xml";
+    private static final String CONFIG = "log4j-rolling-direct-1906.xml";
 
-    private static final String DIR = "target/rolling-direct-1903";
+    private static final String DIR = "target/rolling-direct-1906";
 
     public static LoggerContextRule loggerContextRule = 
LoggerContextRule.createShutdownTimeoutLoggerContextRule(CONFIG);
 
@@ -55,7 +54,7 @@ public class RollingAppenderDirectWrite1903Test {
 
     @Before
     public void setUp() throws Exception {
-        this.logger = 
loggerContextRule.getLogger(RollingAppenderDirectWrite1903Test.class.getName());
+        this.logger = 
loggerContextRule.getLogger(RollingAppenderDirectWrite1906Test.class.getName());
     }
 
     @Test
diff --git a/log4j-core/src/test/resources/log4j-rolling-direct-1903.xml 
b/log4j-core/src/test/resources/log4j-rolling-direct-1906.xml
similarity index 79%
rename from log4j-core/src/test/resources/log4j-rolling-direct-1903.xml
rename to log4j-core/src/test/resources/log4j-rolling-direct-1906.xml
index 4c7494a..326d0ca 100644
--- a/log4j-core/src/test/resources/log4j-rolling-direct-1903.xml
+++ b/log4j-core/src/test/resources/log4j-rolling-direct-1906.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="trace" monitorInterval="30">
+<Configuration status="WARN" monitorInterval="30">
   <Properties>
-    <Property name="baseDir">target/rolling-direct-1903</Property>
+    <Property name="baseDir">target/rolling-direct-1906</Property>
   </Properties>
   <Appenders>
     <RollingFile name="RollingFile" 
filePattern="${baseDir}/rollingfile.%d{yyyy-MM-dd-HH-mm-ss}.log">

Reply via email to