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.
>
>

Reply via email to