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/03 18:12:51 UTC

[2/3] logging-log4j2 git commit: LOG4J2-1343 initial gc-free version

LOG4J2-1343 initial gc-free version


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

Branch: refs/heads/LOG4J2-1344-gc-free-fileappender
Commit: 7aa4dc5ae2b35309f2b84f2d17e4cb909848acc9
Parents: b7d7833
Author: rpopma <rp...@apache.org>
Authored: Mon Apr 4 01:12:02 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Mon Apr 4 01:12:02 2016 +0900

----------------------------------------------------------------------
 .../appender/AbstractOutputStreamAppender.java  | 21 +++++++++++++++-----
 .../core/appender/OutputStreamManager.java      | 18 +++++++++++++++++
 2 files changed, 34 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7aa4dc5a/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..3b44efd 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,12 +95,21 @@ 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 {
+            if (Constants.ENABLE_THREADLOCALS) {
+                final ByteBufferDestination destination = manager.getByteBufferDestination();
+                getLayout().encode(event, destination);
+                if (this.immediateFlush || event.isEndOfBatch()) {
+                    destination.drain(destination.getByteBuffer()); // write buffer to outputStream
+                    manager.flush();
+                }
+                return;
+            }
             final byte[] bytes = getLayout().toByteArray(event);
             if (bytes != null && bytes.length > 0) {
                 manager.write(bytes, this.immediateFlush || event.isEndOfBatch());

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7aa4dc5a/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..433c2e0 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
@@ -18,8 +18,11 @@ package org.apache.logging.log4j.core.appender;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.Objects;
 
 import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.layout.ByteBufferDestination;
+import org.apache.logging.log4j.core.util.OutputStreamByteBufferDestinationAdapter;
 
 /**
  * Manages an OutputStream so that it can be shared by multiple Appenders and will
@@ -29,9 +32,15 @@ public class OutputStreamManager extends AbstractManager {
 
     private volatile OutputStream os;
     protected final Layout<?> layout;
+    protected final ByteBufferDestination byteBufferDestination;
 
     protected OutputStreamManager(final OutputStream os, final String streamName, final Layout<?> layout,
             final boolean writeHeader) {
+        this(os, streamName, layout, writeHeader, new OutputStreamByteBufferDestinationAdapter(os));
+    }
+
+    protected OutputStreamManager(final OutputStream os, final String streamName, final Layout<?> layout,
+            final boolean writeHeader, final ByteBufferDestination byteBufferDestination) {
         super(streamName);
         this.os = os;
         this.layout = layout;
@@ -45,6 +54,7 @@ public class OutputStreamManager extends AbstractManager {
                 }
             }
         }
+        this.byteBufferDestination = Objects.requireNonNull(byteBufferDestination, "byteBufferDestination");
     }
 
     /**
@@ -61,6 +71,10 @@ public class OutputStreamManager extends AbstractManager {
         return AbstractManager.getManager(name, factory, data);
     }
 
+    public ByteBufferDestination getByteBufferDestination() {
+        return byteBufferDestination;
+    }
+
     /**
      * Default hook to write footer during close.
      */
@@ -74,6 +88,10 @@ public class OutputStreamManager extends AbstractManager {
      * Writes the footer.
      */
     protected void writeFooter() {
+        // ensure all buffered data is written to the stream before writing footer
+        final ByteBufferDestination destination = getByteBufferDestination();
+        destination.drain(destination.getByteBuffer());
+
         if (layout == null) {
             return;
         }