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 2020/02/10 15:52:38 UTC
[logging-log4j2] 02/02: LOG4J2-2760 - Always write header to new
files
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
commit edb3b5d58afbb18c1e60fd2e18869a0bd9e1aee7
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Mon Feb 10 08:52:19 2020 -0700
LOG4J2-2760 - Always write header to new files
---
.../logging/log4j/core/appender/FileManager.java | 1 +
.../log4j/core/appender/OutputStreamManager.java | 48 ++++++++--------------
.../core/appender/rolling/RollingFileManager.java | 4 +-
...llingAppenderDirectWriteWithHtmlLayoutTest.java | 13 ++----
src/changes/changes.xml | 4 ++
5 files changed, 28 insertions(+), 42 deletions(-)
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
index 710b51a..842979d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
@@ -196,6 +196,7 @@ public class FileManager extends OutputStreamManager {
} catch (Exception ex) {
LOGGER.warn("Unable to set current file tiem for {}", filename);
}
+ writeHeader(fos);
}
defineAttributeView(Paths.get(filename));
return fos;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
index f05c7f0..77cb60b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
@@ -60,15 +60,8 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
super(null, streamName);
this.outputStream = os;
this.layout = layout;
- if (writeHeader && layout != null) {
- final byte[] header = layout.getHeader();
- if (header != null) {
- try {
- getOutputStream().write(header, 0, header.length);
- } catch (final IOException e) {
- logError("Unable to write header", e);
- }
- }
+ if (writeHeader) {
+ writeHeader(os);
}
this.byteBuffer = Objects.requireNonNull(byteBuffer, "byteBuffer");
}
@@ -88,15 +81,8 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
this.layout = layout;
this.byteBuffer = Objects.requireNonNull(byteBuffer, "byteBuffer");
this.outputStream = os;
- if (writeHeader && layout != null) {
- final byte[] header = layout.getHeader();
- if (header != null) {
- try {
- getOutputStream().write(header, 0, header.length);
- } catch (final IOException e) {
- logError("Unable to write header for " + streamName, e);
- }
- }
+ if (writeHeader) {
+ writeHeader(os);
}
}
@@ -136,6 +122,19 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
return closeOutputStream();
}
+ protected void writeHeader(OutputStream os) {
+ if (layout != null && os != null) {
+ final byte[] header = layout.getHeader();
+ if (header != null) {
+ try {
+ os.write(header, 0, header.length);
+ } catch (final IOException e) {
+ logError("Unable to write header", e);
+ }
+ }
+ }
+ }
+
/**
* Writes the footer.
*/
@@ -164,23 +163,12 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
protected OutputStream getOutputStream() throws IOException {
if (outputStream == null) {
outputStream = createOutputStream();
- setOutputStream(outputStream); // Needed so the header will be written
}
return outputStream;
}
protected void setOutputStream(final OutputStream os) {
- final byte[] header = layout.getHeader();
- if (header != null) {
- try {
- os.write(header, 0, header.length);
- this.outputStream = os; // only update field if os.write() succeeded
- } catch (final IOException ioe) {
- logError("Unable to write header", ioe);
- }
- } else {
- this.outputStream = os;
- }
+ this.outputStream = os;
}
/**
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 3233818..c66bd6d 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
@@ -647,12 +647,9 @@ public class RollingFileManager extends FileManager {
@Override
public RollingFileManager createManager(final String name, final FactoryData data) {
long size = 0;
- boolean writeHeader = !data.append;
File file = null;
if (data.fileName != null) {
file = new File(data.fileName);
- // LOG4J2-1140: check writeHeader before creating the file
- writeHeader = !data.append || !file.exists();
try {
FileUtils.makeParentDirs(file);
@@ -672,6 +669,7 @@ public class RollingFileManager extends FileManager {
new FileOutputStream(data.fileName, data.append);
// LOG4J2-531 create file first so time has valid value.
final long initialTime = file == null || !file.exists() ? 0 : initialFileTime(file);
+ final boolean writeHeader = file != null && file.exists() && file.length() == 0;
final RollingFileManager rm = new RollingFileManager(data.getLoggerContext(), data.fileName, data.pattern, os,
data.append, data.createOnDemand, size, initialTime, data.policy, data.strategy, data.advertiseURI,
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteWithHtmlLayoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteWithHtmlLayoutTest.java
index 24799ed..af8aaef 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteWithHtmlLayoutTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteWithHtmlLayoutTest.java
@@ -16,13 +16,11 @@
*/
package org.apache.logging.log4j.core.appender.rolling;
-import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.appender.RollingFileAppender;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.layout.HtmlLayout;
import org.apache.logging.log4j.core.util.IOUtils;
-import org.apache.logging.log4j.junit.CleanFolders;
import org.apache.logging.log4j.junit.LoggerContextRule;
import org.apache.logging.log4j.message.SimpleMessage;
import org.hamcrest.Matchers;
@@ -34,7 +32,6 @@ import org.junit.rules.RuleChain;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import java.util.zip.GZIPInputStream;
import static org.apache.logging.log4j.hamcrest.Descriptors.that;
import static org.apache.logging.log4j.hamcrest.FileMatchers.hasName;
@@ -70,13 +67,11 @@ public class RollingAppenderDirectWriteWithHtmlLayoutTest {
Configuration config = loggerContextRule.getConfiguration();
RollingFileAppender appender = RollingFileAppender.newBuilder()
.setName("RollingHtml")
- .setFilePattern(DIR + "/" + prefix + "_-%d{MM-dd-yy-HH-mm}-%i.html")
- .setPolicy(new SizeBasedTriggeringPolicy(500))
- .setStrategy(DirectWriteRolloverStrategy.newBuilder()
- .setConfig(config)
- .build())
+ .withFilePattern(DIR + "/" + prefix + "_-%d{MM-dd-yy-HH-mm}-%i.html")
+ .withPolicy(new SizeBasedTriggeringPolicy(500))
+ .withStrategy(DirectWriteRolloverStrategy.newBuilder().withConfig(config).build())
.setLayout(HtmlLayout.createDefaultLayout())
- .setAppend(append)
+ .withAppend(append)
.build();
boolean stopped = false;
try {
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 2094c7d..5abb369 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -30,6 +30,10 @@
- "remove" - Removed
-->
<release version="2.13.1" date="2019-MM-DD" description="GA Release 2.13.1">
+ <action issue="LOG4J2-2760" dev="rgoers" type="fix" due-to="Christoph Kaser">
+ Always write header on a new OutputStream.
+ </action>
+ <action issue=
<action issue="LOG4J2-2777" dev="rgoers" type="update" due-to="joongs4">
Add a retry count attribute to the KafkaAppender.
</action>