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>
