You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2016/04/04 18:41:26 UTC

[1/7] logging-log4j2 git commit: LOG4J2-1343, LOG4J2-1344 Create separate kill switch for new garbage-free layout mechanism

Repository: logging-log4j2
Updated Branches:
  refs/heads/LOG4J2-1343-no-gc-outputstreamappenders [created] 3a871dab9


LOG4J2-1343, LOG4J2-1344 Create separate kill switch for new garbage-free layout mechanism


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

Branch: refs/heads/LOG4J2-1343-no-gc-outputstreamappenders
Commit: 054c4f9efbfa8197346ace074b17251b3317c7ad
Parents: af27987
Author: rpopma <rp...@apache.org>
Authored: Tue Apr 5 01:32:46 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Tue Apr 5 01:32:46 2016 +0900

----------------------------------------------------------------------
 .../org/apache/logging/log4j/core/util/Constants.java | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/054c4f9e/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java
index 6cd0e8a..dd1cd27 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java
@@ -72,7 +72,7 @@ public final class Constants {
             "log4j.format.msg.async", false);
 
     /**
-     * {@code true} if we think we are running in a web container, base on the boolean value of system property
+     * {@code true} if we think we are running in a web container, based on the boolean value of system property
      * "log4j2.is.webapp", or (if this system property is not set) whether the  {@code javax.servlet.Servlet} class
      * is present in the classpath.
      */
@@ -91,6 +91,18 @@ public final class Constants {
             "log4j2.enable.threadlocals", true);
 
     /**
+     * Kill switch for garbage-free Layout behaviour that encodes LogEvents directly into
+     * {@link org.apache.logging.log4j.core.layout.ByteBufferDestination}s without creating intermediate temporary
+     * Objects.
+     * <p>
+     * {@code True} by default, disable by setting system property "log4j2.enable.direct.encoders" to "false".
+     *
+     * @since 2.6
+     */
+    public static final boolean ENABLE_DIRECT_ENCODERS = PropertiesUtil.getProperties().getBooleanProperty(
+            "log4j2.enable.direct.encoders", true);
+
+    /**
      * Prevent class instantiation.
      */
     private Constants() {


[7/7] logging-log4j2 git commit: LOG4J2-1343, LOG4J2-1344 Override superclass implementation of getByteBufferDestination

Posted by rp...@apache.org.
LOG4J2-1343, LOG4J2-1344 Override superclass implementation of getByteBufferDestination


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

Branch: refs/heads/LOG4J2-1343-no-gc-outputstreamappenders
Commit: 3a871dab9b07e5139173bf0d6bff8a5e05feaf25
Parents: 8ed48f2
Author: rpopma <rp...@apache.org>
Authored: Tue Apr 5 01:41:26 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Tue Apr 5 01:41:26 2016 +0900

----------------------------------------------------------------------
 .../logging/log4j/core/appender/RandomAccessFileManager.java     | 4 ++++
 .../core/appender/rolling/RollingRandomAccessFileManager.java    | 4 ++++
 2 files changed, 8 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3a871dab/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 ec616c4..6556ebe 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
@@ -77,6 +77,10 @@ public class RandomAccessFileManager extends OutputStreamManager implements Byte
                 isFlush, bufferSize, advertiseURI, layout), FACTORY);
     }
 
+    public ByteBufferDestination getByteBufferDestination() {
+        return this;
+    }
+
     public Boolean isEndOfBatch() {
         return isEndOfBatch.get();
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3a871dab/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 02c47e0..5b3fc05 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
@@ -86,6 +86,10 @@ public class RollingRandomAccessFileManager extends RollingFileManager implement
                 immediateFlush, bufferSize, policy, strategy, advertiseURI, layout), FACTORY);
     }
 
+    public ByteBufferDestination getByteBufferDestination() {
+        return this;
+    }
+
     public Boolean isEndOfBatch() {
         return isEndOfBatch.get();
     }


[2/7] logging-log4j2 git commit: LOG4J2-1343, LOG4J2-1344 Let all OutputStream-based appenders use the new garbage-free layout mechanism if enabled

Posted by rp...@apache.org.
LOG4J2-1343, LOG4J2-1344 Let all OutputStream-based appenders use the new garbage-free layout mechanism if enabled


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

Branch: refs/heads/LOG4J2-1343-no-gc-outputstreamappenders
Commit: 112aff6b006ca37149fe6ba232236096c1b57458
Parents: 054c4f9
Author: rpopma <rp...@apache.org>
Authored: Tue Apr 5 01:34:09 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Tue Apr 5 01:34:09 2016 +0900

----------------------------------------------------------------------
 .../appender/AbstractOutputStreamAppender.java  | 43 ++++++++++++++++----
 1 file changed, 35 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/112aff6b/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 7ed06d6..62f09c6 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
@@ -20,10 +20,12 @@ import java.io.Serializable;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.layout.ByteBufferDestination;
+import org.apache.logging.log4j.core.util.Constants;
 
 /**
  * Appends log events as bytes to a byte output stream. The stream encoding is defined in the layout.
- * 
+ *
  * @param <M> The kind of {@link OutputStreamManager} under management
  */
 public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager> extends AbstractAppender {
@@ -41,7 +43,7 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager
     /**
      * 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}.
-     * 
+     *
      * @param name The name of the Appender.
      * @param layout The layout to format the message.
      * @param manager The OutputStreamManager.
@@ -55,7 +57,7 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager
 
     /**
      * Gets the immediate flush setting.
-     * 
+     *
      * @return immediate flush.
      */
     public boolean getImmediateFlush() {
@@ -64,7 +66,7 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager
 
     /**
      * Gets the manager.
-     * 
+     *
      * @return the manager.
      */
     public M getManager() {
@@ -93,20 +95,45 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager
      * <p>
      * Most subclasses of <code>AbstractOutputStreamAppender</code> will need to override this method.
      * </p>
-     * 
+     *
      * @param event The LogEvent.
      */
     @Override
     public void append(final LogEvent event) {
         try {
+            tryAppend(event);
+        } catch (final AppenderLoggingException alex) {
+            reportAppendError(alex);
+            throw alex;
+        } catch (final Exception ex) {
+            reportAppendError(ex);
+            throw new AppenderLoggingException(ex);
+        }
+    }
+
+    private void tryAppend(final LogEvent event) {
+        if (Constants.ENABLE_DIRECT_ENCODERS) {
+            directEncodeEvent(event);
+        } else {
             final byte[] bytes = getLayout().toByteArray(event);
             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;
         }
     }
 
+    private void directEncodeEvent(final LogEvent event) {
+        synchronized (manager) {
+            final ByteBufferDestination destination = manager.getByteBufferDestination();
+            getLayout().encode(event, destination);
+            if (this.immediateFlush || event.isEndOfBatch()) {
+                destination.drain(destination.getByteBuffer()); // write buffer to outputStream
+                manager.flush();
+            }
+        }
+    }
+
+    private void reportAppendError(final Exception ex) {
+        error("Unable to write to stream " + manager.getName() + " for appender " + getName() + ": " + ex);
+    }
 }


[4/7] logging-log4j2 git commit: javadoc fix

Posted by rp...@apache.org.
javadoc fix


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

Branch: refs/heads/LOG4J2-1343-no-gc-outputstreamappenders
Commit: 0f3d825e64652be44f7727bc3c40bca751a7276d
Parents: 6df053a
Author: rpopma <rp...@apache.org>
Authored: Tue Apr 5 01:36:34 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Tue Apr 5 01:36:34 2016 +0900

----------------------------------------------------------------------
 .../logging/log4j/core/appender/ConsoleAppender.java    | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0f3d825e/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
index 354171a..4e1e87c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
@@ -57,7 +57,7 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
     private static final AtomicInteger COUNT = new AtomicInteger();
 
     private final Target target;
-    
+
     /**
      * Enumeration of console destinations.
      */
@@ -76,7 +76,7 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
 
     /**
      * Creates a Console Appender.
-     * 
+     *
      * @param layout The layout to use (required).
      * @param filter The Filter or null.
      * @param targetStr The target ("SYSTEM_OUT" or "SYSTEM_ERR"). The default is "SYSTEM_OUT".
@@ -85,7 +85,7 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
      * @param ignore If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise they
      *            are propagated to the caller.
      * @return The ConsoleAppender.
-     * @deprecated Use {@link #createAppender(Layout, Filter, Target, String, String, boolean)}.
+     * @deprecated Use {@link #createAppender(Layout, Filter, Target, String, boolean, boolean)}.
      */
     @Deprecated
     public static ConsoleAppender createAppender(Layout<? extends Serializable> layout,
@@ -109,7 +109,7 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
 
     /**
      * Creates a Console Appender.
-     * 
+     *
      * @param layout The layout to use (required).
      * @param filter The Filter or null.
      * @param target The target (SYSTEM_OUT or SYSTEM_ERR). The default is SYSTEM_OUT.
@@ -337,7 +337,7 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
 
         /**
          * Constructor.
-         * 
+         *
          * @param os The OutputStream.
          * @param type The name of the target.
          * @param layout A Serializable layout
@@ -356,7 +356,7 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
 
         /**
          * Create an OutputStreamManager.
-         * 
+         *
          * @param name The name of the entity to manage.
          * @param data The data required to create the entity.
          * @return The OutputStreamManager


[6/7] logging-log4j2 git commit: LOG4J2-1343, LOG4J2-1344 Delegate to superclass to use the new garbage-free layout mechanism if enabled

Posted by rp...@apache.org.
LOG4J2-1343, LOG4J2-1344 Delegate to superclass to use the new garbage-free layout mechanism if enabled


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

Branch: refs/heads/LOG4J2-1343-no-gc-outputstreamappenders
Commit: 8ed48f2bbca7286c747df663344c42dba4677116
Parents: ff21f25
Author: rpopma <rp...@apache.org>
Authored: Tue Apr 5 01:40:22 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Tue Apr 5 01:40:22 2016 +0900

----------------------------------------------------------------------
 .../log4j/core/appender/RandomAccessFileAppender.java  | 13 ++-----------
 .../core/appender/RollingRandomAccessFileAppender.java | 13 ++-----------
 2 files changed, 4 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8ed48f2b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java
index 8bcf8e2..043bccf 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java
@@ -85,17 +85,8 @@ public final class RandomAccessFileAppender extends AbstractOutputStreamAppender
         // of immediateFlush=true.
         getManager().setEndOfBatch(event.isEndOfBatch());
 
-        // LOG4J2-1292 utilize gc-free Layout.encode() method
-        // super.append(event);
-        try {
-            getLayout().encode(event, getManager());
-            if (getImmediateFlush() || event.isEndOfBatch()) {
-                getManager().flush();
-            }
-        } catch (final AppenderLoggingException ex) {
-            error("Unable to write to stream " + getManager().getName() + " for appender " + getName());
-            throw ex;
-        }
+        // LOG4J2-1292 utilize gc-free Layout.encode() method: taken care of in superclass
+        super.append(event);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8ed48f2b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java
index 21cff5b..1eea8f5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java
@@ -95,17 +95,8 @@ public final class RollingRandomAccessFileAppender extends AbstractOutputStreamA
         // of immediateFlush=true.
         manager.setEndOfBatch(event.isEndOfBatch());
 
-        // LOG4J2-1292 utilize gc-free Layout.encode() method
-        // super.append(event);
-        try {
-            getLayout().encode(event, getManager());
-            if (getImmediateFlush() || event.isEndOfBatch()) {
-                getManager().flush();
-            }
-        } catch (final AppenderLoggingException ex) {
-            error("Unable to write to stream " + getManager().getName() + " for appender " + getName());
-            throw ex;
-        }
+        // LOG4J2-1292 utilize gc-free Layout.encode() method: taken care of in superclass
+        super.append(event);
     }
 
     /**


[5/7] logging-log4j2 git commit: LOG4J2-1344 FileManager and RollingFileManager manage their buffer size so cannot delegate creating a ByteBufferDestinationOutputStream to the constructor of their OutputStreamManager superclass

Posted by rp...@apache.org.
LOG4J2-1344 FileManager and RollingFileManager manage their buffer size so cannot delegate creating a ByteBufferDestinationOutputStream to the constructor of their OutputStreamManager superclass


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

Branch: refs/heads/LOG4J2-1343-no-gc-outputstreamappenders
Commit: ff21f2567f83a87f43d036cfc6f4a69f0748931b
Parents: 0f3d825
Author: rpopma <rp...@apache.org>
Authored: Tue Apr 5 01:38:53 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Tue Apr 5 01:38:53 2016 +0900

----------------------------------------------------------------------
 .../logging/log4j/core/appender/FileManager.java   | 11 +++++++++--
 .../core/appender/rolling/RollingFileManager.java  | 17 +++++++++++++++--
 2 files changed, 24 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ff21f256/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 4de34ad..e45b28c 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
@@ -29,6 +29,8 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.util.ByteBufferDestinationOutputStream;
+import org.apache.logging.log4j.core.util.Constants;
 
 
 /**
@@ -126,7 +128,7 @@ public class FileManager extends OutputStreamManager {
     public boolean isLocking() {
         return isLocking;
     }
-    
+
     /**
      * Returns the buffer size to use if the appender was configured with BufferedIO=true, otherwise returns a negative
      * number.
@@ -203,7 +205,12 @@ public class FileManager extends OutputStreamManager {
                 os = new FileOutputStream(name, data.append);
                 int bufferSize = data.bufferSize;
                 if (data.bufferedIO) {
-                    os = new BufferedOutputStream(os, bufferSize);
+
+                    // LOG4J2-1344 this Manager controls the buffer size so wrap the stream here
+                    // (or OutputStreamManager constructor will wrap the stream with a default-size buffer).
+                    os = Constants.ENABLE_DIRECT_ENCODERS
+                            ? new ByteBufferDestinationOutputStream(os, bufferSize)
+                            : new BufferedOutputStream(os, bufferSize);
                 } else {
                     bufferSize = -1; // signals to RollingFileManager not to use BufferedOutputStream
                 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ff21f256/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 81104e8..2b824d7 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
@@ -32,6 +32,8 @@ import org.apache.logging.log4j.core.appender.FileManager;
 import org.apache.logging.log4j.core.appender.ManagerFactory;
 import org.apache.logging.log4j.core.appender.rolling.action.AbstractAction;
 import org.apache.logging.log4j.core.appender.rolling.action.Action;
+import org.apache.logging.log4j.core.util.ByteBufferDestinationOutputStream;
+import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.core.util.Log4jThread;
 
 /**
@@ -135,7 +137,13 @@ public class RollingFileManager extends FileManager {
     protected void createFileAfterRollover() throws IOException  {
         final OutputStream os = new FileOutputStream(getFileName(), isAppend());
         if (getBufferSize() > 0) { // negative buffer size means no buffering
-            setOutputStream(new BufferedOutputStream(os, getBufferSize()));
+
+            // LOG4J2-1344 this Manager controls the buffer size so wrap the stream here
+            // (or OutputStreamManager constructor will wrap the stream with a default-size buffer).
+            final OutputStream actual = Constants.ENABLE_DIRECT_ENCODERS
+                    ? new ByteBufferDestinationOutputStream(os, getBufferSize())
+                    : new BufferedOutputStream(os, getBufferSize());
+            setOutputStream(actual);
         } else {
             setOutputStream(os);
         }
@@ -403,7 +411,12 @@ public class RollingFileManager extends FileManager {
                 os = new FileOutputStream(name, data.append);
                 int bufferSize = data.bufferSize;
                 if (data.bufferedIO) {
-                    os = new BufferedOutputStream(os, bufferSize);
+
+                    // LOG4J2-1344 this Manager controls the buffer size so wrap the stream here
+                    // (or OutputStreamManager constructor will wrap the stream with a default-size buffer).
+                    os = Constants.ENABLE_DIRECT_ENCODERS
+                            ? new ByteBufferDestinationOutputStream(os, bufferSize)
+                            : new BufferedOutputStream(os, bufferSize);
                 } else {
                     bufferSize = -1; // negative buffer size signals bufferedIO was configured false
                 }


[3/7] logging-log4j2 git commit: LOG4J2-1343, LOG4J2-1344 Let all OutputStream Managers wrap their OutputStream in a ByteBufferDestinationOutputStream, to be used by the Appender to participate in the new garbage-free Layout mechanism

Posted by rp...@apache.org.
LOG4J2-1343, LOG4J2-1344 Let all OutputStream Managers wrap their OutputStream in a ByteBufferDestinationOutputStream, to be used by the Appender to participate in the new garbage-free Layout mechanism


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

Branch: refs/heads/LOG4J2-1343-no-gc-outputstreamappenders
Commit: 6df053ac756f469efc6a9e9cf662767c5e5cbe43
Parents: 112aff6
Author: rpopma <rp...@apache.org>
Authored: Tue Apr 5 01:35:58 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Tue Apr 5 01:35:58 2016 +0900

----------------------------------------------------------------------
 .../core/appender/OutputStreamManager.java      | 29 ++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6df053ac/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 cb1813e..428ef7e 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
@@ -16,10 +16,15 @@
  */
 package org.apache.logging.log4j.core.appender;
 
+import java.io.BufferedOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 
 import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.layout.ByteBufferDestination;
+import org.apache.logging.log4j.core.util.ByteBufferDestinationOutputStream;
+import org.apache.logging.log4j.core.util.Constants;
+import org.apache.logging.log4j.core.util.NullOutputStream;
 
 /**
  * Manages an OutputStream so that it can be shared by multiple Appenders and will
@@ -33,7 +38,7 @@ public class OutputStreamManager extends AbstractManager {
     protected OutputStreamManager(final OutputStream os, final String streamName, final Layout<?> layout,
             final boolean writeHeader) {
         super(streamName);
-        this.os = os;
+        this.os = adaptForDirectEncoding(os);
         this.layout = layout;
         if (writeHeader && layout != null) {
             final byte[] header = layout.getHeader();
@@ -47,6 +52,13 @@ public class OutputStreamManager extends AbstractManager {
         }
     }
 
+    // LOG4J2-1343 enable all OutputStreamAppenders to use new garbage-free layout mechanism.
+    // Appenders that control buffer size have already wrapped the output stream or give us a dummy stream.
+    private static OutputStream adaptForDirectEncoding(final OutputStream os) {
+        final boolean SHOULD_WRAP = !(os instanceof ByteBufferDestination) && !(os instanceof NullOutputStream);
+        return Constants.ENABLE_DIRECT_ENCODERS && SHOULD_WRAP ? new ByteBufferDestinationOutputStream(os) : os;
+    }
+
     /**
      * Creates a Manager.
      *
@@ -62,6 +74,18 @@ public class OutputStreamManager extends AbstractManager {
     }
 
     /**
+     * Returns the {@code ByteBufferDestination} for the Layout to directly encode the LogEvent into.
+     * @return the {@code ByteBufferDestination} for the Layout to directly encode the LogEvent into
+     */
+    public ByteBufferDestination getByteBufferDestination() {
+        if (Constants.ENABLE_DIRECT_ENCODERS) {
+            return (ByteBufferDestination) os;
+        }
+        throw new UnsupportedOperationException(
+                "ByteBufferDestination not available unless direct encoders are enabled");
+    }
+
+    /**
      * Default hook to write footer during close.
      */
     @Override
@@ -95,7 +119,8 @@ public class OutputStreamManager extends AbstractManager {
         return os;
     }
 
-    protected void setOutputStream(final OutputStream os) {
+    protected void setOutputStream(final OutputStream original) {
+        final OutputStream os = adaptForDirectEncoding(original);
         final byte[] header = layout.getHeader();
         if (header != null) {
             try {