LOG4J2-1292 Update RandomAccessFileAppender and RollingRandomAccessFileAppender 
to utilize gc-free Layout.encode() method.


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

Branch: refs/heads/LOG4J2-1278-gc-free-logger
Commit: 6a0c2e6addc75ee0d720f2e79049c04741641ba4
Parents: 6a5a8d3
Author: rpopma <[email protected]>
Authored: Mon Feb 22 00:06:13 2016 +0900
Committer: rpopma <[email protected]>
Committed: Mon Feb 22 00:06:13 2016 +0900

----------------------------------------------------------------------
 .../core/appender/RandomAccessFileAppender.java  | 17 ++++++++++++++---
 .../core/appender/RandomAccessFileManager.java   | 18 +++++++++++++++---
 .../RollingRandomAccessFileAppender.java         | 19 +++++++++++++++----
 .../rolling/RollingRandomAccessFileManager.java  | 16 ++++++++++++++--
 src/changes/changes.xml                          |  3 +++
 5 files changed, 61 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6a0c2e6a/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 006ec0a..c2aaaab 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
@@ -49,7 +49,7 @@ public final class RandomAccessFileAppender extends 
AbstractOutputStreamAppender
     private RandomAccessFileAppender(final String name, final Layout<? extends 
Serializable> layout,
             final Filter filter, final RandomAccessFileManager manager, final 
String filename,
             final boolean ignoreExceptions, final boolean immediateFlush, 
final Advertiser advertiser) {
-        
+
         super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
         if (advertiser != null) {
             final Map<String, String> configuration = new HashMap<>(
@@ -86,7 +86,18 @@ public final class RandomAccessFileAppender extends 
AbstractOutputStreamAppender
         // _always_ available in the log file, without incurring the overhead
         // of immediateFlush=true.
         getManager().setEndOfBatch(event.isEndOfBatch());
-        super.append(event);
+
+        // 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;
+        }
     }
 
     /**
@@ -97,7 +108,7 @@ public final class RandomAccessFileAppender extends 
AbstractOutputStreamAppender
     public String getFileName() {
         return this.fileName;
     }
-    
+
     /**
      * Returns the size of the file manager's buffer.
      * @return the buffer size

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6a0c2e6a/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 12af7ee..ec616c4 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
@@ -26,6 +26,7 @@ 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.NullOutputStream;
 
 /**
@@ -33,7 +34,7 @@ import org.apache.logging.log4j.core.util.NullOutputStream;
  * this class uses a {@code ByteBuffer} and a {@code RandomAccessFile} to do 
the
  * I/O.
  */
-public class RandomAccessFileManager extends OutputStreamManager {
+public class RandomAccessFileManager extends OutputStreamManager implements 
ByteBufferDestination {
     static final int DEFAULT_BUFFER_SIZE = 256 * 1024;
 
     private static final RandomAccessFileManagerFactory FACTORY = new 
RandomAccessFileManagerFactory();
@@ -134,7 +135,7 @@ public class RandomAccessFileManager extends 
OutputStreamManager {
     public String getFileName() {
         return getName();
     }
-    
+
     /**
      * Returns the buffer capacity.
      * @return the buffer size
@@ -148,7 +149,7 @@ public class RandomAccessFileManager extends 
OutputStreamManager {
      * <p>
      * Key: "fileURI" Value: provided "advertiseURI" param.
      * </p>
-     * 
+     *
      * @return Map of content format keys supporting FileManager
      */
     @Override
@@ -159,6 +160,17 @@ public class RandomAccessFileManager extends 
OutputStreamManager {
         return result;
     }
 
+    @Override
+    public ByteBuffer getByteBuffer() {
+        return buffer;
+    }
+
+    @Override
+    public ByteBuffer drain(final ByteBuffer buf) {
+        flush();
+        return buffer;
+    }
+
     /**
      * Factory Data.
      */

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6a0c2e6a/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 59bd529..419a4d5 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
@@ -45,7 +45,7 @@ import org.apache.logging.log4j.core.util.Integers;
  * intervals.
  */
 @Plugin(name = "RollingRandomAccessFile", category = "Core", elementType = 
"appender", printObject = true)
-public final class RollingRandomAccessFileAppender extends 
AbstractOutputStreamAppender<RollingFileManager> {
+public final class RollingRandomAccessFileAppender extends 
AbstractOutputStreamAppender<RollingRandomAccessFileManager> {
 
     private static final long serialVersionUID = 1L;
 
@@ -55,7 +55,7 @@ public final class RollingRandomAccessFileAppender extends 
AbstractOutputStreamA
     private final Advertiser advertiser;
 
     private RollingRandomAccessFileAppender(final String name, final Layout<? 
extends Serializable> layout,
-            final Filter filter, final RollingFileManager manager, final 
String fileName,
+            final Filter filter, final RollingRandomAccessFileManager manager, 
final String fileName,
             final String filePattern, final boolean ignoreExceptions,
             final boolean immediateFlush, final int bufferSize, final 
Advertiser advertiser) {
         super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
@@ -97,7 +97,18 @@ public final class RollingRandomAccessFileAppender extends 
AbstractOutputStreamA
         // _always_ available in the log file, without incurring the overhead
         // of immediateFlush=true.
         manager.setEndOfBatch(event.isEndOfBatch());
-        super.append(event);
+
+        // 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;
+        }
     }
 
     /**
@@ -117,7 +128,7 @@ public final class RollingRandomAccessFileAppender extends 
AbstractOutputStreamA
     public String getFilePattern() {
         return filePattern;
     }
-    
+
     /**
      * Returns the size of the file manager's buffer.
      * @return the buffer size

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6a0c2e6a/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 56a1b47..d436c2a 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
@@ -26,13 +26,14 @@ import java.nio.ByteBuffer;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.appender.AppenderLoggingException;
 import org.apache.logging.log4j.core.appender.ManagerFactory;
+import org.apache.logging.log4j.core.layout.ByteBufferDestination;
 import org.apache.logging.log4j.core.util.NullOutputStream;
 
 /**
  * Extends RollingFileManager but instead of using a buffered output stream, 
this class uses a {@code ByteBuffer} and a
  * {@code RandomAccessFile} to do the I/O.
  */
-public class RollingRandomAccessFileManager extends RollingFileManager {
+public class RollingRandomAccessFileManager extends RollingFileManager 
implements ByteBufferDestination {
     /**
      * The default buffer size.
      */
@@ -146,7 +147,7 @@ public class RollingRandomAccessFileManager extends 
RollingFileManager {
 
     /**
      * Returns the buffer capacity.
-     * 
+     *
      * @return the buffer size
      */
     @Override
@@ -154,6 +155,17 @@ public class RollingRandomAccessFileManager extends 
RollingFileManager {
         return buffer.capacity();
     }
 
+    @Override
+    public ByteBuffer getByteBuffer() {
+        return buffer;
+    }
+
+    @Override
+    public ByteBuffer drain(final ByteBuffer buf) {
+        flush();
+        return buffer;
+    }
+
     /**
      * Factory to create a RollingRandomAccessFileManager.
      */

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6a0c2e6a/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 4f8f00c..264bc4d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -24,6 +24,9 @@
   </properties>
   <body>
     <release version="2.6" date="2016-MM-DD" description="GA Release 2.6">
+      <action issue="LOG4J2-1292" dev="rpopma" type="update">
+        Update RandomAccessFileAppender and RollingRandomAccessFileAppender to 
utilize gc-free Layout.encode() method.
+      </action>
       <action issue="LOG4J2-1274" dev="rpopma" type="add">
         Add encode() method to Layout API to enable converting LogEvents to 
bytes without creating temporary objects.
       </action>

Reply via email to