Introducing an abstract class implementating both TriggeringPolicy and LifeCycle will help future users, that's good.
I don't think you need another interface. To be backwards compatible we need to keep using the existing TriggeringPolicy interface. Then, in places where you want to call a LifeCycle method on the triggeringPolicy object, you need to check with instanceof before casting to LifeCycle and calling the desired method. Sent from my iPhone > On 2016/09/08, at 3:04, Gary Gregory <garydgreg...@gmail.com> wrote: > > To facilitate things, I created an AbstractTriggeringPolicy that extends > AbstractLifeCycle; that should help future-proof changes to some extent. > > Are you thinking about something like public interface "TriggeringPolicy2 > extends TriggeringPolicy, LifeCycle"? > > Gary > >> On Wed, Sep 7, 2016 at 11:38 AM, Remko Popma <remko.po...@gmail.com> wrote: >> 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. > > > > -- > E-Mail: garydgreg...@gmail.com | ggreg...@apache.org > Java Persistence with Hibernate, Second Edition > JUnit in Action, Second Edition > Spring Batch in Action > Blog: http://garygregory.wordpress.com > Home: http://garygregory.com/ > Tweet! http://twitter.com/GaryGregory