You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2021/03/01 03:22:04 UTC

[logging-log4j2] branch release-2.x updated: LOG4J2-2981 - OnStartupTriggeringPolicy would fail to cause the file to roll over with DirectWriteTriggeringPolicy unless minSize was set to 0

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 a0f8f0d  LOG4J2-2981 - OnStartupTriggeringPolicy would fail to cause the file to roll over with DirectWriteTriggeringPolicy unless minSize was set to 0
a0f8f0d is described below

commit a0f8f0df6c275f86037a8699710e366b84b91da4
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Sun Feb 28 19:45:06 2021 -0700

    LOG4J2-2981 - OnStartupTriggeringPolicy would fail to cause the file to roll over with DirectWriteTriggeringPolicy unless minSize was set to 0
---
 .../core/appender/rolling/RollingFileManager.java  | 12 +++-
 ...ava => RollingAppenderOnStartupDirectTest.java} | 76 +++++++++++-----------
 .../rolling/RollingAppenderOnStartupTest.java      | 61 ++++++++---------
 .../src/test/resources/__files/onStartup.log       | 19 +-----
 .../{log4j-test4.xml => log4j-rollOnStartup.xml}   |  8 ++-
 ...g4j-test4.xml => log4j-rollOnStartupDirect.xml} | 11 ++--
 src/changes/changes.xml                            |  4 ++
 7 files changed, 98 insertions(+), 93 deletions(-)

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 39c35ed..77693f0 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
@@ -155,6 +155,16 @@ public class RollingFileManager extends FileManager {
         if (!initialized) {
             LOGGER.debug("Initializing triggering policy {}", triggeringPolicy);
             initialized = true;
+            // LOG4J2-2981 - set the file size before initializing the triggering policy.
+            if (directWrite) {
+                // LOG4J2-2485: Initialize size from the most recently written file.
+                File file = new File(getFileName());
+                if (file.exists()) {
+                    size = file.length();
+                } else {
+                    ((DirectFileRolloverStrategy) rolloverStrategy).clearCurrentFileName();
+                }
+            }
             triggeringPolicy.initialize(this);
             if (triggeringPolicy instanceof LifeCycle) {
                 ((LifeCycle) triggeringPolicy).start();
@@ -340,7 +350,7 @@ public class RollingFileManager extends FileManager {
 	}
 
     public synchronized void rollover() {
-        if (!hasOutputStream() && !isCreateOnDemand()) {
+        if (!hasOutputStream() && !isCreateOnDemand() && !isDirectWrite()) {
             return;
         }
         if (rollover(rolloverStrategy)) {
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderOnStartupTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderOnStartupDirectTest.java
similarity index 60%
copy from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderOnStartupTest.java
copy to log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderOnStartupDirectTest.java
index 29a7f7d..4de059b 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderOnStartupTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderOnStartupDirectTest.java
@@ -25,43 +25,35 @@ import java.nio.file.StandardCopyOption;
 import java.nio.file.attribute.BasicFileAttributeView;
 import java.nio.file.attribute.FileTime;
 import java.time.Instant;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.config.Configurator;
 import org.junit.AfterClass;
-import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Rule;
 import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 /**
  *
  */
-public class RollingAppenderOnStartupTest {
+public class RollingAppenderOnStartupDirectTest {
 
     private static final String SOURCE = "src/test/resources/__files";
     private static final String DIR = "target/onStartup";
-    private static final String CONFIG = "log4j-test4.xml";
+    private static final String CONFIG = "log4j-rollOnStartupDirect.xml";
     private static final String FILENAME = "onStartup.log";
+    private static final String PREFIX = "This is test message number ";
+    private static final String ROLLED = "onStartup-";
+    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy");
 
-    private Logger logger;
-
-    @Rule
-    public LoggerContextRule loggerContextRule;
-
-    public RollingAppenderOnStartupTest() {
-        this.loggerContextRule = LoggerContextRule.createShutdownTimeoutLoggerContextRule(CONFIG);
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        this.logger = this.loggerContextRule.getLogger(RollingAppenderOnStartupTest.class.getName());
-    }
+    private static LoggerContext loggerContext;
 
     @BeforeClass
     public static void beforeClass() throws Exception {
@@ -74,36 +66,44 @@ public class RollingAppenderOnStartupTest {
             }
         }
         Files.createDirectory(new File(DIR).toPath());
-        Path target = Paths.get(DIR, FILENAME);
+        String fileName = ROLLED + formatter.format(LocalDate.now()) + "-1.log";
+        Path target = Paths.get(DIR, fileName);
         Files.copy(Paths.get(SOURCE, FILENAME), target, StandardCopyOption.COPY_ATTRIBUTES);
         FileTime newTime = FileTime.from(Instant.now().minus(1, ChronoUnit.DAYS));
         Files.getFileAttributeView(target, BasicFileAttributeView.class).setTimes(newTime, newTime, newTime);
     }
 
-    @AfterClass
-    public static void afterClass() throws Exception {
+    @Test
+    public void performTest() throws Exception {
+        loggerContext = Configurator.initialize("Test", CONFIG);
+        final Logger logger = loggerContext.getLogger(RollingAppenderOnStartupDirectTest.class);
+        for (int i = 3; i < 10; ++i) {
+            logger.debug(PREFIX + i);
+        }
+        int fileCount = 0;
         try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get(DIR))) {
-            boolean rolled = false;
             for (final Path path : directoryStream) {
-                if (!path.toFile().getName().endsWith(FILENAME)) {
-                    rolled = true;
-                }
-                try (Stream<String> stream = Files.lines(path)) {
-                    List<String> lines = stream.collect(Collectors.toList());
-                    assertTrue("No header present for " + path.toFile().getName(), lines.get(0).startsWith("<!DOCTYPE HTML"));
+                ++fileCount;
+                if (path.toFile().getName().startsWith(ROLLED)) {
+                    List<String> lines = Files.readAllLines(path);
+                    assertTrue("No messages in " + path.toFile().getName(), lines.size() > 0);
+                    assertTrue("Missing message for " + path.toFile().getName(),
+                            lines.get(0).startsWith(PREFIX));
                 }
-                Files.delete(path);
             }
-            assertTrue("File did not roll", rolled);
         }
-        Files.delete(Paths.get("target/onStartup"));
+        assertEquals("File did not roll", 2, fileCount);
     }
 
-    @Test
-    public void testAppender() throws Exception {
-        for (int i = 0; i < 100; ++i) {
-            logger.debug("This is test message number " + i);
+    @AfterClass
+    public static void afterClass() throws Exception {
+        try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get(DIR))) {
+            for (final Path path : directoryStream) {
+                Files.delete(path);
+            }
         }
-
+        Files.delete(Paths.get(DIR));
+        Configurator.shutdown(loggerContext);
     }
+
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderOnStartupTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderOnStartupTest.java
index 29a7f7d..2d739d7 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderOnStartupTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderOnStartupTest.java
@@ -31,12 +31,16 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.config.Configurator;
 import org.apache.logging.log4j.junit.LoggerContextRule;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 /**
@@ -46,22 +50,12 @@ public class RollingAppenderOnStartupTest {
 
     private static final String SOURCE = "src/test/resources/__files";
     private static final String DIR = "target/onStartup";
-    private static final String CONFIG = "log4j-test4.xml";
+    private static final String CONFIG = "log4j-rollOnStartup.xml";
     private static final String FILENAME = "onStartup.log";
+    private static final String PREFIX = "This is test message number ";
+    private static final String ROLLED = "onStartup-";
 
-    private Logger logger;
-
-    @Rule
-    public LoggerContextRule loggerContextRule;
-
-    public RollingAppenderOnStartupTest() {
-        this.loggerContextRule = LoggerContextRule.createShutdownTimeoutLoggerContextRule(CONFIG);
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        this.logger = this.loggerContextRule.getLogger(RollingAppenderOnStartupTest.class.getName());
-    }
+    private static LoggerContext loggerContext;
 
     @BeforeClass
     public static void beforeClass() throws Exception {
@@ -80,30 +74,37 @@ public class RollingAppenderOnStartupTest {
         Files.getFileAttributeView(target, BasicFileAttributeView.class).setTimes(newTime, newTime, newTime);
     }
 
-    @AfterClass
-    public static void afterClass() throws Exception {
+    @Test
+    public void performTest() throws Exception {
+        boolean rolled = false;
+        loggerContext = Configurator.initialize("Test", CONFIG);
+        final Logger logger = loggerContext.getLogger(RollingAppenderOnStartupTest.class);
+        for (int i = 3; i < 10; ++i) {
+            logger.debug(PREFIX + i);
+        }
         try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get(DIR))) {
-            boolean rolled = false;
             for (final Path path : directoryStream) {
-                if (!path.toFile().getName().endsWith(FILENAME)) {
+                if (path.toFile().getName().startsWith(ROLLED)) {
                     rolled = true;
+                    List<String> lines = Files.readAllLines(path);
+                    assertTrue("No messages in " + path.toFile().getName(), lines.size() > 0);
+                    assertTrue("Missing message for " + path.toFile().getName(),
+                            lines.get(0).startsWith(PREFIX + "1"));
                 }
-                try (Stream<String> stream = Files.lines(path)) {
-                    List<String> lines = stream.collect(Collectors.toList());
-                    assertTrue("No header present for " + path.toFile().getName(), lines.get(0).startsWith("<!DOCTYPE HTML"));
-                }
-                Files.delete(path);
             }
-            assertTrue("File did not roll", rolled);
         }
-        Files.delete(Paths.get("target/onStartup"));
+        assertTrue("File did not roll", rolled);
     }
 
-    @Test
-    public void testAppender() throws Exception {
-        for (int i = 0; i < 100; ++i) {
-            logger.debug("This is test message number " + i);
+    @AfterClass
+    public static void afterClass() throws Exception {
+        try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get(DIR))) {
+            for (final Path path : directoryStream) {
+                Files.delete(path);
+            }
         }
-
+        Files.delete(Paths.get(DIR));
+        Configurator.shutdown(loggerContext);
     }
+
 }
diff --git a/log4j-core/src/test/resources/__files/onStartup.log b/log4j-core/src/test/resources/__files/onStartup.log
index 036b721..6775010 100644
--- a/log4j-core/src/test/resources/__files/onStartup.log
+++ b/log4j-core/src/test/resources/__files/onStartup.log
@@ -1,16 +1,3 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-<meta charset="UTF-8"/>
-<title>Log4j Log Messages</title>
-<style type="text/css">
-<!--
-body, table {font-family:arial,sans-serif; font-size: medium
-;}th {background: #336699; color: #FFFFFF; text-align: left;}
--->
-</style>
-</head>
-<body bgcolor="#FFFFFF" topmargin="6" leftmargin="6">
-
-<br>
-</body></html>
\ No newline at end of file
+This is test message number 1
+This is test message number 2
+This is test message number 3
\ No newline at end of file
diff --git a/log4j-core/src/test/resources/log4j-test4.xml b/log4j-core/src/test/resources/log4j-rollOnStartup.xml
similarity index 84%
copy from log4j-core/src/test/resources/log4j-test4.xml
copy to log4j-core/src/test/resources/log4j-rollOnStartup.xml
index a1ee305..c7b26fa 100644
--- a/log4j-core/src/test/resources/log4j-test4.xml
+++ b/log4j-core/src/test/resources/log4j-rollOnStartup.xml
@@ -16,13 +16,15 @@
  limitations under the License.
 
 -->
-<Configuration status="OFF" name="XMLConfigTest" monitorInterval="1">
+<Configuration status="WARN" name="XMLConfigTest" monitorInterval="1">
   <Appenders>
     <RollingFile name="RollingFile" fileName="target/onStartup/onStartup.log"
                  filePattern="target/onStartup/onStartup-%d{MM-dd-yyyy}-%i.log">
-      <HTMLLayout title="test"/>
+      <PatternLayout>
+        <Pattern>%m%n</Pattern>
+      </PatternLayout>
       <Policies>
-        <OnStartupTriggeringPolicy />
+        <OnStartupTriggeringPolicy minSize="10"/>
       </Policies>
     </RollingFile>
   </Appenders>
diff --git a/log4j-core/src/test/resources/log4j-test4.xml b/log4j-core/src/test/resources/log4j-rollOnStartupDirect.xml
similarity index 76%
rename from log4j-core/src/test/resources/log4j-test4.xml
rename to log4j-core/src/test/resources/log4j-rollOnStartupDirect.xml
index a1ee305..2e0f004 100644
--- a/log4j-core/src/test/resources/log4j-test4.xml
+++ b/log4j-core/src/test/resources/log4j-rollOnStartupDirect.xml
@@ -16,13 +16,14 @@
  limitations under the License.
 
 -->
-<Configuration status="OFF" name="XMLConfigTest" monitorInterval="1">
+<Configuration status="WARN" name="XMLConfigTest" monitorInterval="1">
   <Appenders>
-    <RollingFile name="RollingFile" fileName="target/onStartup/onStartup.log"
-                 filePattern="target/onStartup/onStartup-%d{MM-dd-yyyy}-%i.log">
-      <HTMLLayout title="test"/>
+    <RollingFile name="RollingFile" filePattern="target/onStartup/onStartup-%d{MM-dd-yyyy}-%i.log">
+      <PatternLayout>
+        <Pattern>%m%n</Pattern>
+      </PatternLayout>
       <Policies>
-        <OnStartupTriggeringPolicy />
+        <OnStartupTriggeringPolicy minSize="10"/>
       </Policies>
     </RollingFile>
   </Appenders>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 7c0b068..6808cf0 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -31,6 +31,10 @@
     -->
     <release version="2.14.1" date="2021-MM-DD" description="GA Release 2.14.1">
       <!-- FIXES -->
+      <action issue="LOG4J2-2981" dev="rgoers" type="fix">
+        OnStartupTriggeringPolicy would fail to cause the file to roll over with DirectWriteTriggeringPolicy
+        unless minSize was set to 0.
+      </action>
       <action issue="LOG4J2-2990" dev="rgoers" type="fix" due-to="Diogo Monteiro">
         Reduce garbage by using putAll when copying the ThreadContext for SLF4J.
       </action>