Repository: logging-log4j2
Updated Branches:
  refs/heads/master aed2298e3 -> 07723ec68


LOG4J2-1440 - Fix bug in OnStartupTriggeringPolicy that allowed it to roll over 
on every reconfiguration. Added minSize attribute


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/07723ec6
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/07723ec6
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/07723ec6

Branch: refs/heads/master
Commit: 07723ec6865042952bd09af158ca8c2a952933bc
Parents: aed2298
Author: Ralph Goers <rgo...@nextiva.com>
Authored: Sun Jun 19 22:22:56 2016 -0700
Committer: Ralph Goers <rgo...@nextiva.com>
Committed: Sun Jun 19 22:22:56 2016 -0700

----------------------------------------------------------------------
 .../rolling/OnStartupTriggeringPolicy.java      | 51 ++++++++++++++++++--
 .../rolling/OnStartupTriggeringPolicyTest.java  |  2 +-
 .../rolling/RollingFileAppenderAccessTest.java  |  4 +-
 src/changes/changes.xml                         |  4 ++
 src/site/xdoc/manual/appenders.xml              | 20 +++++++-
 5 files changed, 71 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/07723ec6/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
index d018570..12e2b23 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
@@ -16,16 +16,57 @@
  */
 package org.apache.logging.log4j.core.appender.rolling;
 
+import java.lang.reflect.Method;
+
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.util.Loader;
+import org.apache.logging.log4j.status.StatusLogger;
 
 /**
  * Triggers a rollover on every restart, but only if the file size is greater 
than zero.
  */
 @Plugin(name = "OnStartupTriggeringPolicy", category = "Core", printObject = 
true)
 public class OnStartupTriggeringPolicy implements TriggeringPolicy {
-    private RollingFileManager manager;
+
+    private static final long JVM_START_TIME = initStartTime();
+
+    private final long minSize;
+
+    private OnStartupTriggeringPolicy(long minSize) {
+        this.minSize = minSize;
+    }
+
+    /**
+     * Returns the result of {@code 
ManagementFactory.getRuntimeMXBean().getStartTime()},
+     * or the current system time if JMX is not available.
+     */
+    private static long initStartTime() {
+        // LOG4J2-379:
+        // We'd like to call 
ManagementFactory.getRuntimeMXBean().getStartTime(),
+        // but Google App Engine throws a java.lang.NoClassDefFoundError
+        // "java.lang.management.ManagementFactory is a restricted class".
+        // The reflection is necessary because without it, Google App Engine
+        // will refuse to initialize this class.
+        try {
+            final Class<?> factoryClass = 
Loader.loadSystemClass("java.lang.management.ManagementFactory");
+            final Method getRuntimeMXBean = 
factoryClass.getMethod("getRuntimeMXBean");
+            final Object runtimeMXBean = getRuntimeMXBean.invoke(null);
+
+            final Class<?> runtimeMXBeanClass = 
Loader.loadSystemClass("java.lang.management.RuntimeMXBean");
+            final Method getStartTime = 
runtimeMXBeanClass.getMethod("getStartTime");
+            final Long result = (Long) getStartTime.invoke(runtimeMXBean);
+
+            return result;
+        } catch (final Throwable t) {
+            StatusLogger.getLogger().error("Unable to call 
ManagementFactory.getRuntimeMXBean().getStartTime(), "
+                    + "using system time for OnStartupTriggeringPolicy", t);
+            // We have little option but to declare "now" as the beginning of 
time.
+            return System.currentTimeMillis();
+        }
+    }
 
     /**
      * Provide the RollingFileManager to the policy.
@@ -33,8 +74,7 @@ public class OnStartupTriggeringPolicy implements 
TriggeringPolicy {
      */
     @Override
     public void initialize(final RollingFileManager manager) {
-        this.manager = manager;
-        if (manager.getFileSize() > 0) {
+        if (manager.getFileTime() < JVM_START_TIME && manager.getFileSize() >= 
minSize) {
             manager.skipFooter(true);
             manager.rollover();
             manager.skipFooter(false);
@@ -57,7 +97,8 @@ public class OnStartupTriggeringPolicy implements 
TriggeringPolicy {
     }
 
     @PluginFactory
-    public static OnStartupTriggeringPolicy createPolicy() {
-        return new OnStartupTriggeringPolicy();
+    public static OnStartupTriggeringPolicy createPolicy(
+            @PluginAttribute(value = "minSize", defaultLong = 1) final long 
minSize) {
+        return new OnStartupTriggeringPolicy(minSize);
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/07723ec6/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
index ad1e5c7..799163e 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
@@ -55,7 +55,7 @@ public class OnStartupTriggeringPolicyTest {
                 .withConfiguration(configuration).build();
         final RolloverStrategy strategy = 
DefaultRolloverStrategy.createStrategy(null, null, null, "0", null, true,
                 configuration);
-        final OnStartupTriggeringPolicy policy = 
OnStartupTriggeringPolicy.createPolicy();
+        final OnStartupTriggeringPolicy policy = 
OnStartupTriggeringPolicy.createPolicy(1);
         final RollingFileManager manager = 
RollingFileManager.getFileManager(TARGET_FILE, TARGET_PATTERN, true, false,
                 policy, strategy, null, layout, 8192, true);
         manager.initialize();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/07723ec6/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
index 41d995b..ad6cd4c 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
@@ -28,7 +28,7 @@ public class RollingFileAppenderAccessTest {
 
     /**
      * Not a real test, just make sure we can compile access to the typed 
manager.
-     * 
+     *
      * @throws IOException
      */
     @Test
@@ -38,7 +38,7 @@ public class RollingFileAppenderAccessTest {
         final File file = File.createTempFile("RollingFileAppenderAccessTest", 
".tmp");
         file.deleteOnExit();
         final RollingFileAppender appender = 
RollingFileAppender.createAppender(file.getCanonicalPath(), "FilePattern",
-                null, "Name", null, null, null, 
OnStartupTriggeringPolicy.createPolicy(), null, null, null, null, null,
+                null, "Name", null, null, null, 
OnStartupTriggeringPolicy.createPolicy(1), 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

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/07723ec6/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index a91eab4..039adfa 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -24,6 +24,10 @@
   </properties>
   <body>
     <release version="2.6.2" date="2016-MM-DD" description="GA Release 2.6.2">
+      <action issue="LOG4J2-1440" dev="rgoers">
+        Fix bug in OnStartupTriggeringPolicy that allowed it to roll over on 
every reconfiguration. Added
+        minSize attribute.
+      </action>
       <action issue="LOG4J2-1414" dev="rpopma" type="fix" due-to="Ralph Goers">
         Fixed minor issues with the 2.6.1 web site.
       </action>

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/07723ec6/src/site/xdoc/manual/appenders.xml
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/appenders.xml 
b/src/site/xdoc/manual/appenders.xml
index f516d00..13ae2a4 100644
--- a/src/site/xdoc/manual/appenders.xml
+++ b/src/site/xdoc/manual/appenders.xml
@@ -2231,9 +2231,25 @@ public class JpaLogEntity extends 
AbstractLogEventWrapperEntity {
               </table>
             <h5>OnStartup Triggering Policy</h5>
               <p>
-                The <code>OnStartupTriggeringPolicy</code> policy takes no 
parameters and causes a rollover if the log
-                file is older than the current JVM's start time.
+                The <code>OnStartupTriggeringPolicy</code> policy causes a 
rollover if the log file is older than the
+                current JVM's start time and the minimum file size is met or 
exceeded.
               </p>
+                <table>
+                  <caption align="top">OnStartupTriggeringPolicy 
Parameters</caption>
+                  <tr>
+                    <th>Parameter Name</th>
+                    <th>Type</th>
+                    <th>Description</th>
+                  </tr>
+                  <tr>
+                    <td>minSize</td>
+                    <td>long</td>
+                    <td>
+                      The minimum size the file must have to roll over. A size 
of zero will cause a roll over no matter
+                      what the file size is. The default value is 1, which 
will prevent rolling over an empty file.
+                    </td>
+                  </tr>
+                </table>
               <p>
                 <em>Google App Engine note:</em><br />
                 When running in Google App Engine, the OnStartup policy causes 
a rollover if the log file is older

Reply via email to