You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2016/01/12 17:50:51 UTC

[43/50] logging-log4j2 git commit: [LOG4J2-1230] Don't concatenate SYSLOG Messages.

[LOG4J2-1230] Don't concatenate SYSLOG Messages.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/5b1404b6
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/5b1404b6
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/5b1404b6

Branch: refs/heads/LOG4J-1181
Commit: 5b1404b6b7ed4a3616111d507ebd819f8a07dd7d
Parents: 711278b
Author: ggregory <gg...@apache.org>
Authored: Mon Jan 4 23:32:11 2016 -0800
Committer: ggregory <gg...@apache.org>
Committed: Mon Jan 4 23:32:11 2016 -0800

----------------------------------------------------------------------
 .../appender/AbstractOutputStreamAppender.java  | 13 ++------
 .../log4j/core/appender/FileManager.java        |  6 ++--
 .../core/appender/MemoryMappedFileManager.java  |  4 +--
 .../core/appender/OutputStreamManager.java      | 32 ++++++++++++++++++--
 .../core/appender/RandomAccessFileManager.java  |  6 ++--
 .../appender/rolling/RollingFileManager.java    |  4 +--
 .../rolling/RollingRandomAccessFileManager.java |  6 ++--
 .../log4j/core/net/TcpSocketManager.java        |  8 +++--
 .../appender/RandomAccessFileManagerTest.java   |  2 +-
 .../RollingRandomAccessFileManagerTest.java     |  9 +++---
 src/changes/changes.xml                         |  3 ++
 11 files changed, 59 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5b1404b6/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
index 5ab28d5..9a4cfde 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
@@ -44,9 +44,6 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager
 
     private final M manager;
 
-    private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
-    private final Lock readLock = rwLock.readLock();
-
     /**
      * Instantiates a WriterAppender and set the output destination to a new {@link java.io.OutputStreamWriter}
      * initialized with <code>os</code> as its {@link java.io.OutputStream}.
@@ -107,20 +104,14 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager
      */
     @Override
     public void append(final LogEvent event) {
-        readLock.lock();
         try {
             final byte[] bytes = getLayout().toByteArray(event);
-            if (bytes.length > 0) {
-                manager.write(bytes);
-                if (this.immediateFlush || event.isEndOfBatch()) {
-                    manager.flush();
-                }
+            if (bytes != null && bytes.length > 0) {
+                manager.write(bytes, this.immediateFlush || event.isEndOfBatch());
             }
         } catch (final AppenderLoggingException ex) {
             error("Unable to write to stream " + manager.getName() + " for appender " + getName());
             throw ex;
-        } finally {
-            readLock.unlock();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5b1404b6/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
----------------------------------------------------------------------
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 827a9c0..4de34ad 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
@@ -76,7 +76,7 @@ public class FileManager extends OutputStreamManager {
     }
 
     @Override
-    protected synchronized void write(final byte[] bytes, final int offset, final int length)  {
+    protected synchronized void write(final byte[] bytes, final int offset, final int length, final boolean immediateFlush)  {
 
         if (isLocking) {
             final FileChannel channel = ((FileOutputStream) getOutputStream()).getChannel();
@@ -90,7 +90,7 @@ public class FileManager extends OutputStreamManager {
                    files strings are configured that somehow map to the same file.*/
                 final FileLock lock = channel.lock(0, Long.MAX_VALUE, false);
                 try {
-                    super.write(bytes, offset, length);
+                    super.write(bytes, offset, length, immediateFlush);
                 } finally {
                     lock.release();
                 }
@@ -99,7 +99,7 @@ public class FileManager extends OutputStreamManager {
             }
 
         } else {
-            super.write(bytes, offset, length);
+            super.write(bytes, offset, length, immediateFlush);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5b1404b6/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
index 7bd0eb5..9335ddb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
@@ -111,8 +111,8 @@ public class MemoryMappedFileManager extends OutputStreamManager {
     }
 
     @Override
-    protected synchronized void write(final byte[] bytes, int offset, int length) {
-        super.write(bytes, offset, length); // writes to dummy output stream
+    protected synchronized void write(final byte[] bytes, int offset, int length, final boolean immediateFlush) {
+        super.write(bytes, offset, length, immediateFlush); // writes to dummy output stream
 
         while (length > mappedBuffer.remaining()) {
             final int chunk = mappedBuffer.remaining();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5b1404b6/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
----------------------------------------------------------------------
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 99c3321..42eaa34 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
@@ -117,10 +117,26 @@ public class OutputStreamManager extends AbstractManager {
      * @param length The number of bytes to write.
      * @throws AppenderLoggingException if an error occurs.
      */
-    protected synchronized void write(final byte[] bytes, final int offset, final int length)  {
-        //System.out.println("write " + count);
+    protected void write(final byte[] bytes, final int offset, final int length) {
+        write(bytes, offset, length, false);
+    }
+    
+    /**
+     * Some output streams synchronize writes while others do not. Synchronizing here insures that
+     * log events won't be intertwined.
+     * @param bytes The serialized Log event.
+     * @param offset The offset into the byte array.
+     * @param length The number of bytes to write.
+     * @param immediateFlush flushes immediately after writing.
+     * @throws AppenderLoggingException if an error occurs.
+     */
+    protected synchronized void write(final byte[] bytes, final int offset, final int length, boolean immediateFlush) {
+        // System.out.println("write " + count);
         try {
             os.write(bytes, offset, length);
+            if (immediateFlush) {
+                os.flush();
+            }
         } catch (final IOException ex) {
             final String msg = "Error writing to stream " + getName();
             throw new AppenderLoggingException(msg, ex);
@@ -133,7 +149,17 @@ public class OutputStreamManager extends AbstractManager {
      * @throws AppenderLoggingException if an error occurs.
      */
     protected void write(final byte[] bytes)  {
-        write(bytes, 0, bytes.length);
+        write(bytes, 0, bytes.length, false);
+    }
+
+    /**
+     * Some output streams synchronize writes while others do not.
+     * @param bytes The serialized Log event.
+     * @param writeAndFlush If true, flushes after writing. 
+     * @throws AppenderLoggingException if an error occurs.
+     */
+    protected void write(final byte[] bytes, boolean immediateFlush)  {
+        write(bytes, 0, bytes.length, immediateFlush);
     }
 
     protected synchronized void close() {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5b1404b6/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileManager.java
index c6627df..12af7ee 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileManager.java
@@ -85,8 +85,8 @@ public class RandomAccessFileManager extends OutputStreamManager {
     }
 
     @Override
-    protected synchronized void write(final byte[] bytes, int offset, int length) {
-        super.write(bytes, offset, length); // writes to dummy output stream
+    protected synchronized void write(final byte[] bytes, int offset, int length, final boolean immediateFlush) {
+        super.write(bytes, offset, length, immediateFlush); // writes to dummy output stream
 
         int chunk = 0;
         do {
@@ -99,7 +99,7 @@ public class RandomAccessFileManager extends OutputStreamManager {
             length -= chunk;
         } while (length > 0);
 
-        if (isImmediateFlush || isEndOfBatch.get() == Boolean.TRUE) {
+        if (immediateFlush || isImmediateFlush || isEndOfBatch.get() == Boolean.TRUE) {
             flush();
         }
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5b1404b6/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
----------------------------------------------------------------------
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 48ff472..fc77a98 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
@@ -89,9 +89,9 @@ public class RollingFileManager extends FileManager {
     }
 
     @Override
-    protected synchronized void write(final byte[] bytes, final int offset, final int length) {
+    protected synchronized void write(final byte[] bytes, final int offset, final int length, final boolean immediateFlush) {
         size += length;
-        super.write(bytes, offset, length);
+        super.write(bytes, offset, length, immediateFlush);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5b1404b6/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java
index b732feb..56a1b47 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java
@@ -94,8 +94,8 @@ public class RollingRandomAccessFileManager extends RollingFileManager {
     }
 
     @Override
-    protected synchronized void write(final byte[] bytes, int offset, int length) {
-        super.write(bytes, offset, length); // writes to dummy output stream, needed to track file size
+    protected synchronized void write(final byte[] bytes, int offset, int length, final boolean immediateFlush) {
+        super.write(bytes, offset, length, immediateFlush); // writes to dummy output stream, needed to track file size
 
         int chunk = 0;
         do {
@@ -108,7 +108,7 @@ public class RollingRandomAccessFileManager extends RollingFileManager {
             length -= chunk;
         } while (length > 0);
 
-        if (isImmediateFlush || isEndOfBatch.get() == Boolean.TRUE) {
+        if (immediateFlush || isImmediateFlush || isEndOfBatch.get() == Boolean.TRUE) {
             flush();
         }
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5b1404b6/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java
index a487438..d518aee 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java
@@ -116,7 +116,7 @@ public class TcpSocketManager extends AbstractSocketManager {
     }
 
     @Override
-    protected void write(final byte[] bytes, final int offset, final int length)  {
+    protected void write(final byte[] bytes, final int offset, final int length, boolean immediateFlush)  {
         if (socket == null) {
             if (connector != null && !immediateFail) {
                 connector.latch();
@@ -128,7 +128,11 @@ public class TcpSocketManager extends AbstractSocketManager {
         }
         synchronized (this) {
             try {
-                getOutputStream().write(bytes, offset, length);
+                final OutputStream outputStream = getOutputStream();
+                outputStream.write(bytes, offset, length);
+                if (immediateFlush) {
+                    outputStream.flush();
+                }
             } catch (final IOException ex) {
                 if (retry && connector == null) {
                     connector = new Reconnector(this);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5b1404b6/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/RandomAccessFileManagerTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/RandomAccessFileManagerTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/RandomAccessFileManagerTest.java
index f127db3..07e8ab2 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/RandomAccessFileManagerTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/RandomAccessFileManagerTest.java
@@ -130,7 +130,7 @@ public class RandomAccessFileManagerTest {
 
         final RandomAccessFileManager manager = RandomAccessFileManager.getFileManager(
                 file.getAbsolutePath(), isAppend, true, RandomAccessFileManager.DEFAULT_BUFFER_SIZE, null, null);
-        manager.write(bytes, 0, bytes.length);
+        manager.write(bytes, 0, bytes.length, false);
         final int expected = bytes.length * 2;
         assertEquals("appended, not overwritten", expected, file.length());
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5b1404b6/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManagerTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManagerTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManagerTest.java
index d96d75e..4baddac 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManagerTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManagerTest.java
@@ -66,7 +66,7 @@ public class RollingRandomAccessFileManagerTest {
 
         final int size = RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE * 3;
         final byte[] data = new byte[size];
-        manager.write(data, 0, data.length); // no buffer overflow exception
+        manager.write(data, 0, data.length, flushNow); // no buffer overflow exception
 
         // buffer is full but not flushed yet
         assertEquals(RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE * 2,
@@ -97,7 +97,7 @@ public class RollingRandomAccessFileManagerTest {
 
         final int size = RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE * 3 + 1;
         final byte[] data = new byte[size];
-        manager.write(data, 0, data.length); // no exception
+        manager.write(data, 0, data.length, flushNow); // no exception
         assertEquals(RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE * 3,
                 raf.length());
 
@@ -146,13 +146,14 @@ public class RollingRandomAccessFileManagerTest {
         }
         assertThat("all flushed to disk", file, hasLength(bytes.length));
 
+        final boolean immediateFlush = true;
         final RollingRandomAccessFileManager manager = RollingRandomAccessFileManager
                 .getRollingRandomAccessFileManager(
                         //
-                        file.getAbsolutePath(), Strings.EMPTY, isAppend, true, RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE,
+                        file.getAbsolutePath(), Strings.EMPTY, isAppend, immediateFlush, RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE,
                         new SizeBasedTriggeringPolicy(Long.MAX_VALUE), //
                         null, null, null);
-        manager.write(bytes, 0, bytes.length);
+        manager.write(bytes, 0, bytes.length, immediateFlush);
         final int expected = bytes.length * 2;
         assertThat("appended, not overwritten", file, hasLength(expected));
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5b1404b6/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 0664458..3182a0c 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -37,6 +37,9 @@
       <action issue="LOG4J2-908" dev="ggregory" type="fix" due-to="Konstantinos Liakos, Patrick Flaherty, Robin Coe, Gary Gregory">
         JSONLayout doesn't add a comma between log events.
       </action>
+      <action issue="LOG4J2-1230" dev="ggregory" type="fix" due-to="Vladimir Hudec, Ralph Goers, Gary Gregory">
+        Don't concatenate SYSLOG Messages.
+      </action>
       <action issue="LOG4J2-1238" dev="ggregory" type="fix">
         org.apache.logging.log4j.core.net.TcpSocketManager and other classes does not report internal exceptions to the status logger.
       </action>