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