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>