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>