I'm okay with most of this except for the part where we modify the TriggeringPolicy interface. I'm sure there is a way to accomplish the goal without breaking binary compatibility. With the AbstractTriggeringPolicy introduced in a later commit, probably all that remains is to use "instanceof LifeCycle" in places where we need to call the LifeCycle methods on the TriggeringPolicy.
On Wed, Sep 7, 2016 at 9:03 AM, <ggreg...@apache.org> wrote: > Repository: logging-log4j2 > Updated Branches: > refs/heads/master 7dd6d7ac8 -> ea302f26a > > > [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/master > Commit: ea302f26ade9600f4dacfbeebb7e96ee5d15a924 > Parents: 7dd6d7a > Author: Gary Gregory <ggreg...@apache.org> > Authored: Tue Sep 6 20:03:14 2016 -0400 > Committer: Gary Gregory <ggreg...@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. > >