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 2016/09/08 14:50:46 UTC

[17/50] [abbrv] logging-log4j2 git commit: [LOG4J2-1259] Log4j threads are leaking on tomcat shutdown. TriggeringPolicy now implement LiceCycle which has a stop(long, TimeUnit) method. This TriggeringPolicy.stop(long, TimeUnit) method can then be called

[LOG4J2-1259] Log4j threads are leaking on tomcat shutdown.
TriggeringPolicy now implement LiceCycle which has a stop(long,
TimeUnit) method. This TriggeringPolicy.stop(long, TimeUnit) method can
then be called from RollingFileManager.releaseSub(long timeout, TimeUnit
timeUnit).

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

Branch: refs/heads/LOG4J2-1349-gcfree-threadcontext
Commit: ea302f26ade9600f4dacfbeebb7e96ee5d15a924
Parents: 7dd6d7a
Author: Gary Gregory <gg...@apache.org>
Authored: Tue Sep 6 20:03:14 2016 -0400
Committer: Gary Gregory <gg...@apache.org>
Committed: Tue Sep 6 20:03:14 2016 -0400

----------------------------------------------------------------------
 .../rolling/CompositeTriggeringPolicy.java      | 169 +++++++--------
 .../appender/rolling/CronTriggeringPolicy.java  |  44 +++-
 .../rolling/OnStartupTriggeringPolicy.java      |   3 +-
 .../appender/rolling/RollingFileManager.java    |   7 +
 .../rolling/SizeBasedTriggeringPolicy.java      | 207 +++++++++----------
 .../rolling/TimeBasedTriggeringPolicy.java      |   3 +-
 .../core/appender/rolling/TriggeringPolicy.java |   3 +-
 7 files changed, 232 insertions(+), 204 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java
index 0ce04de..09133ed 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java
@@ -1,84 +1,85 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache license, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the license for the specific language governing permissions and
- * limitations under the license.
- */
-package org.apache.logging.log4j.core.appender.rolling;
-
-import java.util.Arrays;
-
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-
-/**
- * Triggering policy that wraps other policies.
- */
-@Plugin(name = "Policies", category = "Core", printObject = true)
-public final class CompositeTriggeringPolicy implements TriggeringPolicy {
-
-    private final TriggeringPolicy[] triggeringPolicy;
-
-    private CompositeTriggeringPolicy(final TriggeringPolicy... policies) {
-        this.triggeringPolicy = policies;
-    }
-
-    public TriggeringPolicy[] getTriggeringPolicies() {
-        return triggeringPolicy;
-    }
-
-    /**
-     * Initializes the policy.
-     * @param manager The RollingFileManager.
-     */
-    @Override
-    public void initialize(final RollingFileManager manager) {
-        for (final TriggeringPolicy policy : triggeringPolicy) {
-            policy.initialize(manager);
-        }
-    }
-
-    /**
-     * Determines if a rollover should occur.
-     * @param event A reference to the currently event.
-     * @return true if a rollover should occur, false otherwise.
-     */
-    @Override
-    public boolean isTriggeringEvent(final LogEvent event) {
-        for (final TriggeringPolicy policy : triggeringPolicy) {
-            if (policy.isTriggeringEvent(event)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Create a CompositeTriggeringPolicy.
-     * @param policies The triggering policies.
-     * @return A CompositeTriggeringPolicy.
-     */
-    @PluginFactory
-    public static CompositeTriggeringPolicy createPolicy(
-                                                @PluginElement("Policies") final TriggeringPolicy... policies) {
-        return new CompositeTriggeringPolicy(policies);
-    }
-
-    @Override
-    public String toString() {
-        return "CompositeTriggeringPolicy(policies=" + Arrays.toString(triggeringPolicy) + ")";
-    }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.core.appender.rolling;
+
+import java.util.Arrays;
+
+import org.apache.logging.log4j.core.AbstractLifeCycle;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+
+/**
+ * Triggering policy that wraps other policies.
+ */
+@Plugin(name = "Policies", category = "Core", printObject = true)
+public final class CompositeTriggeringPolicy extends AbstractLifeCycle implements TriggeringPolicy {
+
+    private final TriggeringPolicy[] triggeringPolicy;
+
+    private CompositeTriggeringPolicy(final TriggeringPolicy... policies) {
+        this.triggeringPolicy = policies;
+    }
+
+    public TriggeringPolicy[] getTriggeringPolicies() {
+        return triggeringPolicy;
+    }
+
+    /**
+     * Initializes the policy.
+     * @param manager The RollingFileManager.
+     */
+    @Override
+    public void initialize(final RollingFileManager manager) {
+        for (final TriggeringPolicy policy : triggeringPolicy) {
+            policy.initialize(manager);
+        }
+    }
+
+    /**
+     * Determines if a rollover should occur.
+     * @param event A reference to the currently event.
+     * @return true if a rollover should occur, false otherwise.
+     */
+    @Override
+    public boolean isTriggeringEvent(final LogEvent event) {
+        for (final TriggeringPolicy policy : triggeringPolicy) {
+            if (policy.isTriggeringEvent(event)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Create a CompositeTriggeringPolicy.
+     * @param policies The triggering policies.
+     * @return A CompositeTriggeringPolicy.
+     */
+    @PluginFactory
+    public static CompositeTriggeringPolicy createPolicy(
+                                                @PluginElement("Policies") final TriggeringPolicy... policies) {
+        return new CompositeTriggeringPolicy(policies);
+    }
+
+    @Override
+    public String toString() {
+        return "CompositeTriggeringPolicy(policies=" + Arrays.toString(triggeringPolicy) + ")";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
index c6b2df3..288223c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
@@ -19,8 +19,11 @@ package org.apache.logging.log4j.core.appender.rolling;
 import java.text.ParseException;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
-import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.AbstractLifeCycle;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.CronScheduledFuture;
@@ -30,16 +33,14 @@ import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.core.util.CronExpression;
-import org.apache.logging.log4j.status.StatusLogger;
 
 /**
  * Rolls a file over based on a cron schedule.
  */
 @Plugin(name = "CronTriggeringPolicy", category = "Core", printObject = true)
 @Scheduled
-public final class CronTriggeringPolicy implements TriggeringPolicy {
+public final class CronTriggeringPolicy extends AbstractLifeCycle implements TriggeringPolicy {
 
-    private static final Logger LOGGER = StatusLogger.getLogger();
     private static final String defaultSchedule = "0 0 0 * * ?";
     private RollingFileManager manager;
     private final CronExpression cronExpression;
@@ -57,7 +58,9 @@ public final class CronTriggeringPolicy implements TriggeringPolicy {
 
     /**
      * Initializes the policy.
-     * @param aManager The RollingFileManager.
+     * 
+     * @param aManager
+     *            The RollingFileManager.
      */
     @Override
     public void initialize(final RollingFileManager aManager) {
@@ -74,7 +77,9 @@ public final class CronTriggeringPolicy implements TriggeringPolicy {
 
     /**
      * Determines whether a rollover should occur.
-     * @param event   A reference to the currently event.
+     * 
+     * @param event
+     *            A reference to the currently event.
      * @return true if a rollover should occur.
      */
     @Override
@@ -88,14 +93,17 @@ public final class CronTriggeringPolicy implements TriggeringPolicy {
 
     /**
      * Creates a ScheduledTriggeringPolicy.
-     * @param configuration the Configuration.
-     * @param evaluateOnStartup check if the file should be rolled over immediately.
-     * @param schedule the cron expression.
+     * 
+     * @param configuration
+     *            the Configuration.
+     * @param evaluateOnStartup
+     *            check if the file should be rolled over immediately.
+     * @param schedule
+     *            the cron expression.
      * @return a ScheduledTriggeringPolicy.
      */
     @PluginFactory
-    public static CronTriggeringPolicy createPolicy(
-            @PluginConfiguration final Configuration configuration,
+    public static CronTriggeringPolicy createPolicy(@PluginConfiguration final Configuration configuration,
             @PluginAttribute("evaluateOnStartup") final String evaluateOnStartup,
             @PluginAttribute("schedule") final String schedule) {
         CronExpression cronExpression;
@@ -133,6 +141,20 @@ public final class CronTriggeringPolicy implements TriggeringPolicy {
     }
 
     @Override
+    public boolean stop(long timeout, TimeUnit timeUnit) {
+        setStopping();
+        if (future != null) {
+            try {
+                future.get(timeout, timeUnit);
+            } catch (InterruptedException | ExecutionException | TimeoutException e) {
+                future.cancel(true);
+            }
+        }
+        setStopped();
+        return true;
+    }
+
+    @Override
     public String toString() {
         return "CronTriggeringPolicy(schedule=" + cronExpression.getCronExpression() + ")";
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/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 a380028..ae7e439 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
@@ -18,6 +18,7 @@ package org.apache.logging.log4j.core.appender.rolling;
 
 import java.lang.reflect.Method;
 
+import org.apache.logging.log4j.core.AbstractLifeCycle;
 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;
@@ -29,7 +30,7 @@ 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 {
+public class OnStartupTriggeringPolicy extends AbstractLifeCycle implements TriggeringPolicy {
 
     private static final long JVM_START_TIME = initStartTime();
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
index e00319d..be5f2cb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
@@ -24,6 +24,7 @@ import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.util.concurrent.Future;
 import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 
 import org.apache.logging.log4j.core.Layout;
@@ -173,6 +174,12 @@ public class RollingFileManager extends FileManager {
         }
     }
 
+    @Override
+    public void releaseSub(long timeout, TimeUnit timeUnit) {
+        triggeringPolicy.stop(timeout, timeUnit);
+        super.releaseSub(timeout, timeUnit);
+    }
+    
     public synchronized void rollover() {
         if (rollover(rolloverStrategy)) {
             try {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
index 712d5a6..a0188e7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
@@ -1,106 +1,101 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache license, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the license for the specific language governing permissions and
- * limitations under the license.
- */
-package org.apache.logging.log4j.core.appender.rolling;
-
-import org.apache.logging.log4j.Logger;
-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.status.StatusLogger;
-
-/**
- *
- */
-@Plugin(name = "SizeBasedTriggeringPolicy", category = "Core", printObject = true)
-public class SizeBasedTriggeringPolicy implements TriggeringPolicy {
-    /**
-     * Allow subclasses access to the status logger without creating another instance.
-     */
-    protected static final Logger LOGGER = StatusLogger.getLogger();
-
-    /**
-     * Rollover threshold size in bytes.
-     */
-    private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // let 10 MB the default max size
-
-    private final long maxFileSize;
-
-    private RollingFileManager manager;
-
-    /**
-     * Constructs a new instance.
-     */
-    protected SizeBasedTriggeringPolicy() {
-        this.maxFileSize = MAX_FILE_SIZE;
-    }
-
-    /**
-     * Constructs a new instance.
-     *
-     * @param maxFileSize rollover threshold size in bytes.
-     */
-    protected SizeBasedTriggeringPolicy(final long maxFileSize) {
-        this.maxFileSize = maxFileSize;
-    }
-
-    public long getMaxFileSize() {
-        return maxFileSize;
-    }
-
-    /**
-     * Initialize the TriggeringPolicy.
-     * @param aManager The RollingFileManager.
-     */
-    @Override
-    public void initialize(final RollingFileManager aManager) {
-        this.manager = aManager;
-    }
-
-
-    /**
-     * Returns true if a rollover should occur.
-     * @param event   A reference to the currently event.
-     * @return true if a rollover should take place, false otherwise.
-     */
-    @Override
-    public boolean isTriggeringEvent(final LogEvent event) {
-        final boolean triggered = manager.getFileSize() > maxFileSize;
-        if (triggered) {
-            manager.getPatternProcessor().updateTime();
-        }
-        return triggered;
-    }
-
-    @Override
-    public String toString() {
-        return "SizeBasedTriggeringPolicy(size=" + maxFileSize + ')';
-    }
-
-    /**
-     * Create a SizeBasedTriggeringPolicy.
-     * @param size The size of the file before rollover is required.
-     * @return A SizeBasedTriggeringPolicy.
-     */
-    @PluginFactory
-    public static SizeBasedTriggeringPolicy createPolicy(@PluginAttribute("size") final String size) {
-
-        final long maxSize = size == null ? MAX_FILE_SIZE : FileSize.parse(size, MAX_FILE_SIZE);
-        return new SizeBasedTriggeringPolicy(maxSize);
-    }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.core.appender.rolling;
+
+import org.apache.logging.log4j.core.AbstractLifeCycle;
+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;
+
+/**
+ *
+ */
+@Plugin(name = "SizeBasedTriggeringPolicy", category = "Core", printObject = true)
+public class SizeBasedTriggeringPolicy extends AbstractLifeCycle implements TriggeringPolicy {
+
+    /**
+     * Rollover threshold size in bytes.
+     */
+    private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // let 10 MB the default max size
+
+    private final long maxFileSize;
+
+    private RollingFileManager manager;
+
+    /**
+     * Constructs a new instance.
+     */
+    protected SizeBasedTriggeringPolicy() {
+        this.maxFileSize = MAX_FILE_SIZE;
+    }
+
+    /**
+     * Constructs a new instance.
+     *
+     * @param maxFileSize rollover threshold size in bytes.
+     */
+    protected SizeBasedTriggeringPolicy(final long maxFileSize) {
+        this.maxFileSize = maxFileSize;
+    }
+
+    public long getMaxFileSize() {
+        return maxFileSize;
+    }
+
+    /**
+     * Initialize the TriggeringPolicy.
+     * @param aManager The RollingFileManager.
+     */
+    @Override
+    public void initialize(final RollingFileManager aManager) {
+        this.manager = aManager;
+    }
+
+
+    /**
+     * Returns true if a rollover should occur.
+     * @param event   A reference to the currently event.
+     * @return true if a rollover should take place, false otherwise.
+     */
+    @Override
+    public boolean isTriggeringEvent(final LogEvent event) {
+        final boolean triggered = manager.getFileSize() > maxFileSize;
+        if (triggered) {
+            manager.getPatternProcessor().updateTime();
+        }
+        return triggered;
+    }
+
+    @Override
+    public String toString() {
+        return "SizeBasedTriggeringPolicy(size=" + maxFileSize + ')';
+    }
+
+    /**
+     * Create a SizeBasedTriggeringPolicy.
+     * @param size The size of the file before rollover is required.
+     * @return A SizeBasedTriggeringPolicy.
+     */
+    @PluginFactory
+    public static SizeBasedTriggeringPolicy createPolicy(@PluginAttribute("size") final String size) {
+
+        final long maxSize = size == null ? MAX_FILE_SIZE : FileSize.parse(size, MAX_FILE_SIZE);
+        return new SizeBasedTriggeringPolicy(maxSize);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
index 2111a77..b9fbdd5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
@@ -16,6 +16,7 @@
  */
 package org.apache.logging.log4j.core.appender.rolling;
 
+import org.apache.logging.log4j.core.AbstractLifeCycle;
 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;
@@ -26,7 +27,7 @@ import org.apache.logging.log4j.core.util.Integers;
  * Rolls a file over based on time.
  */
 @Plugin(name = "TimeBasedTriggeringPolicy", category = "Core", printObject = true)
-public final class TimeBasedTriggeringPolicy implements TriggeringPolicy {
+public final class TimeBasedTriggeringPolicy extends AbstractLifeCycle implements TriggeringPolicy {
 
     private long nextRolloverMillis;
     private final int interval;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TriggeringPolicy.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TriggeringPolicy.java
index 412099b..9f66c36 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TriggeringPolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TriggeringPolicy.java
@@ -16,6 +16,7 @@
  */
 package org.apache.logging.log4j.core.appender.rolling;
 
+import org.apache.logging.log4j.core.LifeCycle;
 import org.apache.logging.log4j.core.LogEvent;
 
 /**
@@ -23,7 +24,7 @@ import org.apache.logging.log4j.core.LogEvent;
  * occurs. Such conditions include time of day, file size, an
  * external event, the log request or a combination thereof.
  */
-public interface TriggeringPolicy {
+public interface TriggeringPolicy extends LifeCycle {
 
     /**
      * Initializes this triggering policy.