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

[3/3] logging-log4j2 git commit: LOG4J2-1344 initial gc-free version (draft)

LOG4J2-1344 initial gc-free version (draft)


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

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

----------------------------------------------------------------------
 .../log4j/core/appender/FileManager.java        | 21 +++++++++----
 .../appender/rolling/RollingFileManager.java    | 31 ++++++++++++++++----
 2 files changed, 41 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a0ffd098/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..998695f 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,9 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.layout.ByteBufferDestination;
+import org.apache.logging.log4j.core.util.Constants;
+import org.apache.logging.log4j.core.util.OutputStreamByteBufferDestinationAdapter;
 
 
 /**
@@ -45,8 +48,8 @@ public class FileManager extends OutputStreamManager {
 
     protected FileManager(final String fileName, final OutputStream os, final boolean append, final boolean locking,
             final String advertiseURI, final Layout<? extends Serializable> layout, final int bufferSize,
-            final boolean writeHeader) {
-        super(os, fileName, layout, writeHeader);
+            final boolean writeHeader, final ByteBufferDestination destination) {
+        super(os, fileName, layout, writeHeader, destination);
         this.isAppend = append;
         this.isLocking = locking;
         this.advertiseURI = advertiseURI;
@@ -126,7 +129,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.
@@ -202,13 +205,21 @@ public class FileManager extends OutputStreamManager {
             try {
                 os = new FileOutputStream(name, data.append);
                 int bufferSize = data.bufferSize;
+
+                ByteBufferDestination destination = null;
+
+                // if Constants.ENABLE_THREADLOCALS is true, we use ByteBufferDestination to buffer the data
                 if (data.bufferedIO) {
-                    os = new BufferedOutputStream(os, bufferSize);
+                    if (Constants.ENABLE_THREADLOCALS) {
+                        destination = new OutputStreamByteBufferDestinationAdapter(os, bufferSize);
+                    } else {
+                        os = new BufferedOutputStream(os, bufferSize);
+                    }
                 } else {
                     bufferSize = -1; // signals to RollingFileManager not to use BufferedOutputStream
                 }
                 return new FileManager(name, os, data.append, data.locking, data.advertiseURI, data.layout, bufferSize,
-                        writeHeader);
+                        writeHeader, destination);
             } catch (final FileNotFoundException ex) {
                 LOGGER.error("FileManager (" + name + ") " + ex, ex);
             }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a0ffd098/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..314093f 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,7 +32,10 @@ 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.layout.ByteBufferDestination;
+import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.core.util.Log4jThread;
+import org.apache.logging.log4j.core.util.OutputStreamByteBufferDestinationAdapter;
 
 /**
  * The Rolling File Manager.
@@ -57,8 +60,9 @@ public class RollingFileManager extends FileManager {
     protected RollingFileManager(final String fileName, final String pattern, final OutputStream os,
             final boolean append, final long size, final long time, final TriggeringPolicy triggeringPolicy,
             final RolloverStrategy rolloverStrategy, final String advertiseURI,
-            final Layout<? extends Serializable> layout, final int bufferSize, final boolean writeHeader) {
-        super(fileName, os, append, false, advertiseURI, layout, bufferSize, writeHeader);
+            final Layout<? extends Serializable> layout, final int bufferSize, final boolean writeHeader,
+            final ByteBufferDestination destination) {
+        super(fileName, os, append, false, advertiseURI, layout, bufferSize, writeHeader, destination);
         this.size = size;
         this.initialTime = time;
         this.triggeringPolicy = triggeringPolicy;
@@ -134,9 +138,16 @@ 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()));
+
+        if (getBufferSize() > 0) {
+            if (Constants.ENABLE_THREADLOCALS) {
+                byteBufferDestination.setOutputStream(os);
+                setOutputStream(os);
+            } else {
+                setOutputStream(new BufferedOutputStream(os, getBufferSize()));
+            }
         } else {
+            // Negative buffer size means no buffering.
             setOutputStream(os);
         }
     }
@@ -398,18 +409,26 @@ public class RollingFileManager extends FileManager {
             }
             final long size = data.append ? file.length() : 0;
 
+            ByteBufferDestination destination = null;
             OutputStream os;
             try {
                 os = new FileOutputStream(name, data.append);
                 int bufferSize = data.bufferSize;
+
+                // if Constants.ENABLE_THREADLOCALS is true,
+                // we use ByteBufferDestination to buffer the data
                 if (data.bufferedIO) {
-                    os = new BufferedOutputStream(os, bufferSize);
+                    if (Constants.ENABLE_THREADLOCALS) {
+                        destination = new OutputStreamByteBufferDestinationAdapter(os, bufferSize);
+                    } else {
+                        os = new BufferedOutputStream(os, bufferSize);
+                    }
                 } else {
                     bufferSize = -1; // negative buffer size signals bufferedIO was configured false
                 }
                 final long time = file.lastModified(); // LOG4J2-531 create file first so time has valid value
                 return new RollingFileManager(name, data.pattern, os, data.append, size, time, data.policy,
-                    data.strategy, data.advertiseURI, data.layout, bufferSize, writeHeader);
+                    data.strategy, data.advertiseURI, data.layout, bufferSize, writeHeader, destination);
             } catch (final FileNotFoundException ex) {
                 LOGGER.error("FileManager (" + name + ") " + ex, ex);
             }