Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java (revision 1577286) +++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java (revision ) @@ -25,8 +25,8 @@ import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy; -import org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager; import org.apache.logging.log4j.core.appender.rolling.RollingFileManager; +import org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager; import org.apache.logging.log4j.core.appender.rolling.RolloverStrategy; import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy; import org.apache.logging.log4j.core.config.Configuration; @@ -36,6 +36,7 @@ import org.apache.logging.log4j.core.config.plugins.PluginElement; import org.apache.logging.log4j.core.config.plugins.PluginFactory; import org.apache.logging.log4j.core.helpers.Booleans; +import org.apache.logging.log4j.core.helpers.Integers; import org.apache.logging.log4j.core.layout.PatternLayout; import org.apache.logging.log4j.core.net.Advertiser; @@ -54,7 +55,7 @@ private RollingRandomAccessFileAppender(final String name, final Layout layout, final Filter filter, final RollingFileManager manager, final String fileName, final String filePattern, final boolean ignoreExceptions, - final boolean immediateFlush, final Advertiser advertiser) { + final boolean immediateFlush, final int bufferSize, final Advertiser advertiser) { super(name, layout, filter, ignoreExceptions, immediateFlush, manager); if (advertiser != null) { final Map configuration = new HashMap( @@ -126,6 +127,7 @@ * @param name The name of the Appender (required). * @param immediateFlush When true, events are immediately flushed. Defaults * to "true". + * @param bufferSizeStr The buffer size, defaults to {@value RollingRandomAccessFileManager#DEFAULT_BUFFER_SIZE}. * @param policy The triggering policy. (required). * @param strategy The rollover strategy. Defaults to * DefaultRolloverStrategy. @@ -147,6 +149,7 @@ @PluginAttribute("append") final String append, @PluginAttribute("name") final String name, @PluginAttribute("immediateFlush") final String immediateFlush, + @PluginAttribute("bufferSize") final String bufferSizeStr, @PluginElement("Policy") final TriggeringPolicy policy, @PluginElement("Strategy") RolloverStrategy strategy, @PluginElement("Layout") Layout layout, @@ -160,6 +163,7 @@ final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true); final boolean isFlush = Booleans.parseBoolean(immediateFlush, true); final boolean isAdvertise = Boolean.parseBoolean(advertise); + final int bufferSize = Integers.parseInt(bufferSizeStr, RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE); if (name == null) { LOGGER.error("No name provided for FileAppender"); @@ -194,13 +198,13 @@ final RollingRandomAccessFileManager manager = RollingRandomAccessFileManager.getRollingRandomAccessFileManager(fileName, filePattern, - isAppend, isFlush, policy, strategy, advertiseURI, layout); + isAppend, isFlush, bufferSize, policy, strategy, advertiseURI, layout); if (manager == null) { return null; } return new RollingRandomAccessFileAppender(name, layout, filter, manager, - fileName, filePattern, ignoreExceptions, isFlush, + fileName, filePattern, ignoreExceptions, isFlush, bufferSize, isAdvertise ? config.getAdvertiser() : null); } } Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java (revision 1577286) +++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java (revision ) @@ -33,8 +33,14 @@ * I/O. */ public class RollingRandomAccessFileManager extends RollingFileManager { - static final int DEFAULT_BUFFER_SIZE = 256 * 1024; + // TODO DEFAULT_BUFFER_SIZE really public? see {@code RandomAccessFileManager} + + /** + * The default buffer size + */ + public static final int DEFAULT_BUFFER_SIZE = 256 * 1024; + private static final RollingRandomAccessFileManagerFactory FACTORY = new RollingRandomAccessFileManagerFactory(); private final boolean isImmediateFlush; @@ -44,7 +50,7 @@ public RollingRandomAccessFileManager(final RandomAccessFile raf, final String fileName, final String pattern, final OutputStream os, final boolean append, - final boolean immediateFlush, final long size, final long time, + final boolean immediateFlush, final int bufferSize, final long size, final long time, final TriggeringPolicy policy, final RolloverStrategy strategy, final String advertiseURI, final Layout layout) { super(fileName, pattern, os, append, size, time, policy, strategy, advertiseURI, layout); @@ -52,14 +58,14 @@ this.randomAccessFile = raf; isEndOfBatch.set(Boolean.FALSE); - // TODO make buffer size configurable? - buffer = ByteBuffer.allocate(DEFAULT_BUFFER_SIZE); + // see LOG4J2-566 + buffer = ByteBuffer.allocate(bufferSize); } public static RollingRandomAccessFileManager getRollingRandomAccessFileManager(final String fileName, final String filePattern, - final boolean isAppend, final boolean immediateFlush, final TriggeringPolicy policy, + final boolean isAppend, final boolean immediateFlush, final int bufferSize, final TriggeringPolicy policy, final RolloverStrategy strategy, final String advertiseURI, final Layout layout) { - return (RollingRandomAccessFileManager) getManager(fileName, new FactoryData(filePattern, isAppend, immediateFlush, + return (RollingRandomAccessFileManager) getManager(fileName, new FactoryData(filePattern, isAppend, immediateFlush, bufferSize, policy, strategy, advertiseURI, layout), FACTORY); } @@ -160,7 +166,8 @@ raf.setLength(0); } return new RollingRandomAccessFileManager(raf, name, data.pattern, new DummyOutputStream(), data.append, - data.immediateFlush, size, time, data.policy, data.strategy, data.advertiseURI, data.layout); + data.immediateFlush, data.bufferSize, size, time, data.policy, data.strategy, data.advertiseURI, + data.layout); } catch (final IOException ex) { LOGGER.error("Cannot access RandomAccessFile {}) " + ex); if (raf != null) { @@ -193,6 +200,7 @@ private final String pattern; private final boolean append; private final boolean immediateFlush; + private final int bufferSize; private final TriggeringPolicy policy; private final RolloverStrategy strategy; private final String advertiseURI; @@ -204,13 +212,19 @@ * @param pattern The pattern. * @param append The append flag. * @param immediateFlush + * @param bufferSize + * @param policy + * @param strategy + * @param advertiseURI + * @param layout */ - public FactoryData(final String pattern, final boolean append, final boolean immediateFlush, + public FactoryData(final String pattern, final boolean append, final boolean immediateFlush, final int bufferSize, final TriggeringPolicy policy, final RolloverStrategy strategy, final String advertiseURI, final Layout layout) { this.pattern = pattern; this.append = append; this.immediateFlush = immediateFlush; + this.bufferSize = bufferSize; this.policy = policy; this.strategy = strategy; this.advertiseURI = advertiseURI; Index: log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManagerTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManagerTest.java (revision 1577286) +++ log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManagerTest.java (revision ) @@ -17,9 +17,6 @@ package org.apache.logging.log4j.core.appender.rolling; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -29,6 +26,9 @@ import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + /** * Tests the RollingRandomAccessFileManager class. */ @@ -53,7 +53,7 @@ triggerSize); final RolloverStrategy rolloverStrategy = null; final RollingRandomAccessFileManager manager = new RollingRandomAccessFileManager(raf, - file.getName(), "", os, append, flushNow, triggerSize, time, + file.getName(), "", os, append, flushNow, RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE, triggerSize, time, triggerPolicy, rolloverStrategy, null, null); final int size = RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE * 3; @@ -84,7 +84,7 @@ triggerSize); final RolloverStrategy rolloverStrategy = null; final RollingRandomAccessFileManager manager = new RollingRandomAccessFileManager(raf, - file.getName(), "", os, append, flushNow, triggerSize, time, + file.getName(), "", os, append, flushNow, RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE, triggerSize, time, triggerPolicy, rolloverStrategy, null, null); final int size = RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE * 3 + 1; @@ -120,7 +120,7 @@ final RollingRandomAccessFileManager manager = RollingRandomAccessFileManager .getRollingRandomAccessFileManager( // - file.getAbsolutePath(), "", isAppend, true, + file.getAbsolutePath(), "", isAppend, true, RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE, new SizeBasedTriggeringPolicy(Long.MAX_VALUE), // null, null, null); manager.write(bytes, 0, bytes.length); @@ -144,7 +144,7 @@ final RollingRandomAccessFileManager manager = RollingRandomAccessFileManager .getRollingRandomAccessFileManager( // - file.getAbsolutePath(), "", isAppend, true, + file.getAbsolutePath(), "", isAppend, true, RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE, new SizeBasedTriggeringPolicy(Long.MAX_VALUE), // null, null, null); assertTrue(manager.getFileTime() < expectedMax); @@ -164,7 +164,7 @@ final RollingRandomAccessFileManager manager = RollingRandomAccessFileManager .getRollingRandomAccessFileManager( // - file.getAbsolutePath(), "", isAppend, true, + file.getAbsolutePath(), "", isAppend, true, RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE, new SizeBasedTriggeringPolicy(Long.MAX_VALUE), // null, null, null); assertEquals(file.lastModified(), manager.getFileTime());