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