LOG4J2-1343 FileManager should honor the user-specified buffer size, otherwise it re-uses the garbage-free Layout mechanism defined in the superclass
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/3264915b Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/3264915b Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/3264915b Branch: refs/heads/LOG4J2-1356 Commit: 3264915b9099712b35963648823778c5dd616d4a Parents: dc78ca0 Author: rpopma <[email protected]> Authored: Thu Apr 7 02:59:04 2016 +0900 Committer: rpopma <[email protected]> Committed: Thu Apr 7 02:59:04 2016 +0900 ---------------------------------------------------------------------- .../log4j/core/appender/FileManager.java | 33 ++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3264915b/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..d147127 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 @@ -23,12 +23,15 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.Serializable; +import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; 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; /** @@ -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. @@ -137,6 +140,29 @@ public class FileManager extends OutputStreamManager { } /** + * Returns whether the user requested IO to be buffered. + * @return whether the buffer size is larger than zero. + */ + @Override + protected boolean isBufferedIO() { + return bufferSize > 0; + } + + /** + * Returns a OutputStreamManagerDestination with the user-requested buffer size. + * @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 OutputStreamManagerDestination with the user-requested buffer size + */ + @Override + protected ByteBufferDestination createByteBufferDestination(final boolean immediateFlush) { + if (isBufferedIO()) { + return new OutputStreamManagerDestination(bufferSize, immediateFlush, this); + } + return new OutputStreamManagerDestination(immediateFlush, this); + } + + /** * FileManager's content format is specified by: <code>Key: "fileURI" Value: provided "advertiseURI" param</code>. * * @return Map of content format keys supporting FileManager @@ -202,7 +228,10 @@ public class FileManager extends OutputStreamManager { try { os = new FileOutputStream(name, data.append); int bufferSize = data.bufferSize; - if (data.bufferedIO) { + + // when the garbage-free Layout encode mechanism is used + // we use a ByteBuffer instead of BufferedOutputStream + if (!Constants.ENABLE_DIRECT_ENCODERS && data.bufferedIO) { os = new BufferedOutputStream(os, bufferSize); } else { bufferSize = -1; // signals to RollingFileManager not to use BufferedOutputStream
