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/04/08 14:04:01 UTC

[09/50] logging-log4j2 git commit: LOG4J2-1343 modified OutputStreamManager to add support for subclasses to use the garbage-free Layout mechanism

LOG4J2-1343 modified OutputStreamManager to add support for subclasses to use the 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/723c49f9
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/723c49f9
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/723c49f9

Branch: refs/heads/LOG4J2-1356
Commit: 723c49f96c3adbdf103eafef335a18879ba503c2
Parents: 1e4dd88
Author: rpopma <rp...@apache.org>
Authored: Thu Apr 7 02:56:07 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Thu Apr 7 02:56:07 2016 +0900

----------------------------------------------------------------------
 .../core/appender/OutputStreamManager.java      | 51 ++++++++++++++++++++
 1 file changed, 51 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/723c49f9/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..34498fa 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.nio.ByteBuffer;
 
 import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.layout.ByteBufferDestination;
+import org.apache.logging.log4j.core.util.Constants;
 
 /**
  * Manages an OutputStream so that it can be shared by multiple Appenders and will
@@ -29,6 +32,7 @@ public class OutputStreamManager extends AbstractManager {
 
     private volatile OutputStream os;
     protected final Layout<?> layout;
+    private ByteBufferDestination byteBufferDestination;
 
     protected OutputStreamManager(final OutputStream os, final String streamName, final Layout<?> layout,
             final boolean writeHeader) {
@@ -118,6 +122,7 @@ public class OutputStreamManager extends AbstractManager {
      * @throws AppenderLoggingException if an error occurs.
      */
     protected void write(final byte[] bytes, final int offset, final int length) {
+        flushBuffer();
         write(bytes, offset, length, false);
     }
 
@@ -149,6 +154,7 @@ public class OutputStreamManager extends AbstractManager {
      * @throws AppenderLoggingException if an error occurs.
      */
     protected void write(final byte[] bytes)  {
+        flushBuffer();
         write(bytes, 0, bytes.length, false);
     }
 
@@ -159,10 +165,12 @@ public class OutputStreamManager extends AbstractManager {
      * @throws AppenderLoggingException if an error occurs.
      */
     protected void write(final byte[] bytes, boolean immediateFlush)  {
+        flushBuffer();
         write(bytes, 0, bytes.length, immediateFlush);
     }
 
     protected synchronized void close() {
+        flush();
         final OutputStream stream = os; // access volatile field only once per method
         if (stream == System.out || stream == System.err) {
             return;
@@ -179,10 +187,53 @@ public class OutputStreamManager extends AbstractManager {
      */
     public synchronized void flush() {
         try {
+            flushBuffer();
             os.flush();
         } catch (final IOException ex) {
             final String msg = "Error flushing stream " + getName();
             throw new AppenderLoggingException(msg, ex);
         }
     }
+
+    /**
+     * Drains the ByteBufferDestination's buffer into the destination. By default this calls
+     * {@link OutputStreamManager#write(byte[], int, int, boolean)} with the buffer contents and the Appender's
+     * {@link AbstractOutputStreamAppender#immediateFlush} value.
+     * <p>
+     * This method has no effect if the garbage-free Layout encode mechanism is not enabled.
+     * </p>
+     */
+    protected void flushBuffer() {
+        if (Constants.ENABLE_DIRECT_ENCODERS) {
+            getByteBufferDestination().drain(getByteBufferDestination().getByteBuffer());
+        }
+    }
+
+    /**
+     * Subclasses that do buffered IO should override.
+     * @return this implementation always returns {@code false}
+     */
+    protected boolean isBufferedIO() {
+        return false;
+    }
+
+    public ByteBufferDestination getByteBufferDestination() {
+        return byteBufferDestination;
+    }
+
+    public void setByteBufferDestination(final ByteBufferDestination byteBufferDestination) {
+        this.byteBufferDestination = byteBufferDestination;
+    }
+
+    /**
+     * When the garbage-free Layout.encode mechanism is used, this method is called to create a ByteBufferDestination
+     * for this OutputStreamManager.
+     *
+     * @param immediateFlush the value to pass to the {@link #write(byte[], int, int, boolean)} method when the
+     *          ByteBufferDestination is {@link ByteBufferDestination#drain(ByteBuffer) drained}
+     * @return a new ByteBufferDestination that drains into this OutputStreamManager
+     */
+    protected ByteBufferDestination createByteBufferDestination(final boolean immediateFlush) {
+        return new OutputStreamManagerDestination(immediateFlush, this);
+    }
 }