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:28 UTC

[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

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 {