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 2014/06/21 05:48:56 UTC
svn commit: r1604312 - in /logging/log4j/log4j2/trunk:
log4j-core/src/main/java/org/apache/logging/log4j/core/appender/
log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/
log4j-core/src/test/java/org/apache/logging/log4j/core/appe...
Author: rpopma
Date: Sat Jun 21 03:48:56 2014
New Revision: 1604312
URL: http://svn.apache.org/r1604312
Log:
LOG4J2-674: Made RollingFileAppender buffer size configurable;
LOG4J2-622: RollingFileManager now correctly honours the bufferedIO configuration after rollover.
Modified:
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java
logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
logging/log4j/log4j2/trunk/src/changes/changes.xml
logging/log4j/log4j2/trunk/src/site/xdoc/manual/appenders.xml
Modified: logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java?rev=1604312&r1=1604311&r2=1604312&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java (original)
+++ logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java Sat Jun 21 03:48:56 2014
@@ -41,13 +41,15 @@ public class FileManager extends OutputS
private final boolean isAppend;
private final boolean isLocking;
private final String advertiseURI;
+ private final int bufferSize;
protected FileManager(final String fileName, final OutputStream os, final boolean append, final boolean locking,
- final String advertiseURI, final Layout<? extends Serializable> layout) {
+ final String advertiseURI, final Layout<? extends Serializable> layout, final int bufferSize) {
super(os, fileName, layout);
this.isAppend = append;
this.isLocking = locking;
this.advertiseURI = advertiseURI;
+ this.bufferSize = bufferSize;
}
/**
@@ -123,6 +125,15 @@ public class FileManager extends OutputS
public boolean isLocking() {
return isLocking;
}
+
+ /**
+ * Returns the buffer size to use if the appender was configured with BufferedIO=true, otherwise returns a negative
+ * number.
+ * @return the buffer size, or a negative number if the output stream is not buffered
+ */
+ public int getBufferSize() {
+ return bufferSize;
+ }
/**
* FileManager's content format is specified by: <code>Key: "fileURI" Value: provided "advertiseURI" param</code>.
@@ -188,10 +199,13 @@ public class FileManager extends OutputS
OutputStream os;
try {
os = new FileOutputStream(name, data.append);
+ int bufferSize = data.bufferSize;
if (data.bufferedIO) {
- os = new BufferedOutputStream(os, data.bufferSize);
+ 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);
+ return new FileManager(name, os, data.append, data.locking, data.advertiseURI, data.layout, bufferSize);
} catch (final FileNotFoundException ex) {
LOGGER.error("FileManager (" + name + ") " + ex);
}
Modified: logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java?rev=1604312&r1=1604311&r2=1604312&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java (original)
+++ logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java Sat Jun 21 03:48:56 2014
@@ -37,6 +37,7 @@ import org.apache.logging.log4j.core.con
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.core.net.Advertiser;
import org.apache.logging.log4j.core.util.Booleans;
+import org.apache.logging.log4j.core.util.Integers;
/**
* An appender that writes to files and can roll over at intervals.
@@ -44,6 +45,7 @@ import org.apache.logging.log4j.core.uti
@Plugin(name = "RollingFile", category = "Core", elementType = "appender", printObject = true)
public final class RollingFileAppender extends AbstractOutputStreamAppender<RollingFileManager> {
+ private static final int DEFAULT_BUFFER_SIZE = 8192;
private final String fileName;
private final String filePattern;
private Object advertisement;
@@ -51,9 +53,8 @@ public final class RollingFileAppender e
private RollingFileAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
- final RollingFileManager manager, final String fileName,
- final String filePattern, final boolean ignoreExceptions, final boolean immediateFlush,
- final Advertiser advertiser) {
+ final RollingFileManager manager, final String fileName, final String filePattern,
+ 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<String, String>(layout.getContentFormat());
@@ -109,6 +110,7 @@ public final class RollingFileAppender e
* is overwritten when opened. Defaults to "true"
* @param name The name of the Appender (required).
* @param bufferedIO When true, I/O will be buffered. Defaults to "true".
+ * @param bufferSizeStr buffer size for buffered IO (default is 8192).
* @param immediateFlush When true, events are immediately flushed. Defaults to "true".
* @param policy The triggering policy. (required).
* @param strategy The rollover strategy. Defaults to DefaultRolloverStrategy.
@@ -128,6 +130,7 @@ public final class RollingFileAppender e
@PluginAttribute("append") final String append,
@PluginAttribute("name") final String name,
@PluginAttribute("bufferedIO") final String bufferedIO,
+ @PluginAttribute("bufferSize") final String bufferSizeStr,
@PluginAttribute("immediateFlush") final String immediateFlush,
@PluginElement("Policy") final TriggeringPolicy policy,
@PluginElement("Strategy") RolloverStrategy strategy,
@@ -143,6 +146,10 @@ public final class RollingFileAppender e
final boolean isBuffered = Booleans.parseBoolean(bufferedIO, true);
final boolean isFlush = Booleans.parseBoolean(immediateFlush, true);
final boolean isAdvertise = Boolean.parseBoolean(advertise);
+ final int bufferSize = Integers.parseInt(bufferSizeStr, DEFAULT_BUFFER_SIZE);
+ if (!isBuffered && bufferSize > 0) {
+ LOGGER.warn("The bufferSize is set to {} but bufferedIO is not true: {}", bufferSize, bufferedIO);
+ }
if (name == null) {
LOGGER.error("No name provided for FileAppender");
return null;
@@ -173,7 +180,7 @@ public final class RollingFileAppender e
}
final RollingFileManager manager = RollingFileManager.getFileManager(fileName, filePattern, isAppend,
- isBuffered, policy, strategy, advertiseURI, layout);
+ isBuffered, policy, strategy, advertiseURI, layout, bufferSize);
if (manager == null) {
return null;
}
Modified: logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java?rev=1604312&r1=1604311&r2=1604312&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java (original)
+++ logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java Sat Jun 21 03:48:56 2014
@@ -47,9 +47,10 @@ public class RollingFileManager extends
private final RolloverStrategy rolloverStrategy;
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) {
- super(fileName, os, append, false, advertiseURI, layout);
+ 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) {
+ super(fileName, os, append, false, advertiseURI, layout, bufferSize);
this.size = size;
this.initialTime = time;
this.triggeringPolicy = triggeringPolicy;
@@ -68,15 +69,15 @@ public class RollingFileManager extends
* @param strategy The RolloverStrategy.
* @param advertiseURI the URI to use when advertising the file
* @param layout The Layout.
+ * @param bufferSize buffer size to use if bufferedIO is true
* @return A RollingFileManager.
*/
public static RollingFileManager getFileManager(final String fileName, final String pattern, final boolean append,
- final boolean bufferedIO, final TriggeringPolicy policy,
- final RolloverStrategy strategy, final String advertiseURI,
- final Layout<? extends Serializable> layout) {
+ final boolean bufferedIO, final TriggeringPolicy policy, final RolloverStrategy strategy,
+ final String advertiseURI, final Layout<? extends Serializable> layout, final int bufferSize) {
return (RollingFileManager) getManager(fileName, new FactoryData(pattern, append,
- bufferedIO, policy, strategy, advertiseURI, layout), factory);
+ bufferedIO, policy, strategy, advertiseURI, layout, bufferSize), factory);
}
@Override
@@ -119,7 +120,11 @@ public class RollingFileManager extends
protected void createFileAfterRollover() throws IOException {
final OutputStream os = new FileOutputStream(getFileName(), isAppend());
- setOutputStream(os);
+ if (getBufferSize() > 0) { // negative buffer size means no buffering
+ setOutputStream(new BufferedOutputStream(os, getBufferSize()));
+ } else {
+ setOutputStream(os);
+ }
}
/**
@@ -249,6 +254,7 @@ public class RollingFileManager extends
private final String pattern;
private final boolean append;
private final boolean bufferedIO;
+ private final int bufferSize;
private final TriggeringPolicy policy;
private final RolloverStrategy strategy;
private final String advertiseURI;
@@ -261,13 +267,15 @@ public class RollingFileManager extends
* @param bufferedIO The bufferedIO flag.
* @param advertiseURI
* @param layout The Layout.
+ * @param bufferSize the buffer size
*/
public FactoryData(final String pattern, final boolean append, final boolean bufferedIO,
- final TriggeringPolicy policy, final RolloverStrategy strategy, final String advertiseURI,
- final Layout<? extends Serializable> layout) {
+ final TriggeringPolicy policy, final RolloverStrategy strategy, final String advertiseURI,
+ final Layout<? extends Serializable> layout, final int bufferSize) {
this.pattern = pattern;
this.append = append;
this.bufferedIO = bufferedIO;
+ this.bufferSize = bufferSize;
this.policy = policy;
this.strategy = strategy;
this.advertiseURI = advertiseURI;
@@ -304,12 +312,15 @@ public class RollingFileManager extends
OutputStream os;
try {
os = new FileOutputStream(name, data.append);
+ int bufferSize = data.bufferSize;
if (data.bufferedIO) {
- os = new BufferedOutputStream(os);
+ 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);
+ data.strategy, data.advertiseURI, data.layout, bufferSize);
} catch (final FileNotFoundException ex) {
LOGGER.error("FileManager (" + name + ") " + ex);
}
Modified: logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java?rev=1604312&r1=1604311&r2=1604312&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java (original)
+++ logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java Sat Jun 21 03:48:56 2014
@@ -50,7 +50,7 @@ public class RollingRandomAccessFileMana
final boolean immediateFlush, final int bufferSize, final long size, final long time,
final TriggeringPolicy policy, final RolloverStrategy strategy,
final String advertiseURI, final Layout<? extends Serializable> layout) {
- super(fileName, pattern, os, append, size, time, policy, strategy, advertiseURI, layout);
+ super(fileName, pattern, os, append, size, time, policy, strategy, advertiseURI, layout, bufferSize);
this.isImmediateFlush = immediateFlush;
this.randomAccessFile = raf;
isEndOfBatch.set(Boolean.FALSE);
@@ -75,7 +75,7 @@ public class RollingRandomAccessFileMana
@Override
protected synchronized void write(final byte[] bytes, int offset, int length) {
- super.write(bytes, offset, length); // writes to dummy output stream
+ super.write(bytes, offset, length); // writes to dummy output stream, needed to track file size
int chunk = 0;
do {
Modified: logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java?rev=1604312&r1=1604311&r2=1604312&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java (original)
+++ logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java Sat Jun 21 03:48:56 2014
@@ -52,7 +52,7 @@ public class OnStartupTriggeringPolicyTe
public MyRollingManager(final TriggeringPolicy policy, final RolloverStrategy strategy) {
super("testfile", "target/rolling1/test1-%i.log.gz", new ByteArrayOutputStream(),
- false, 0, System.currentTimeMillis(), policy, strategy, null, null);
+ false, 0, System.currentTimeMillis(), policy, strategy, null, null, 8192);
}
public void setFileTime(final long timestamp) {
Modified: logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java?rev=1604312&r1=1604311&r2=1604312&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java (original)
+++ logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java Sat Jun 21 03:48:56 2014
@@ -39,8 +39,8 @@ public class RollingFileAppenderAccessTe
final File file = File.createTempFile("RollingFileAppenderAccessTest", ".tmp");
file.deleteOnExit();
final RollingFileAppender appender = RollingFileAppender.createAppender(file.getCanonicalPath(), "FilePattern",
- null, "Name", null, null, OnStartupTriggeringPolicy.createPolicy(), null, null, null, null, null, null,
- config);
+ null, "Name", null, null, null, OnStartupTriggeringPolicy.createPolicy(), null, null, null, null, null,
+ null, config);
final RollingFileManager manager = appender.getManager();
// Since the RolloverStrategy and TriggeringPolicy are immutable, we could also use generics to type their
// access.
Modified: logging/log4j/log4j2/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/src/changes/changes.xml?rev=1604312&r1=1604311&r2=1604312&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/src/changes/changes.xml (original)
+++ logging/log4j/log4j2/trunk/src/changes/changes.xml Sat Jun 21 03:48:56 2014
@@ -22,6 +22,12 @@
</properties>
<body>
<release version="2.0-rc2" date="2014-MM-DD" description="Bug fixes and enhancements">
+ <action issue="LOG4J2-622" dev="rpopma" type="fix" due-to="Farooq Khan">
+ RollingFileManager now correctly honours the bufferedIO configuration after rollover.
+ </action>
+ <action issue="LOG4J2-674" dev="rpopma" type="add">
+ Made RollingFileAppender buffer size configurable.
+ </action>
<action issue="LOG4J2-141" dev="rpopma" type="fix" due-to="Joern Huxhorn">
Improved documentation regarding log4j status logger.
</action>
Modified: logging/log4j/log4j2/trunk/src/site/xdoc/manual/appenders.xml
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/src/site/xdoc/manual/appenders.xml?rev=1604312&r1=1604311&r2=1604312&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/src/site/xdoc/manual/appenders.xml (original)
+++ logging/log4j/log4j2/trunk/src/site/xdoc/manual/appenders.xml Sat Jun 21 03:48:56 2014
@@ -1915,6 +1915,11 @@ public class JpaLogEntity extends Abstra
significantly improves performance, even if immediateFlush is enabled.</td>
</tr>
<tr>
+ <td>bufferSize</td>
+ <td>int</td>
+ <td>When bufferedIO is true, this is the buffer size, the default is 8192 bytes.</td>
+ </tr>
+ <tr>
<td>filter</td>
<td>Filter</td>
<td>A Filter to determine if the event should be handled by this Appender. More than one Filter