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/e
>> a302f26/log4j-core/src/main/java/org/apache/logging/log4j/co
>> re/appender/rolling/CompositeTriggeringPolicy.java
>> ----------------------------------------------------------------------
>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/rolling/CompositeTriggeringPolicy.java
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/rolling/CompositeTriggeringPolicy.java
>> index 0ce04de..09133ed 100644
>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/rolling/CompositeTriggeringPolicy.java
>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/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/e
>> a302f26/log4j-core/src/main/java/org/apache/logging/log4j/co
>> re/appender/rolling/CronTriggeringPolicy.java
>> ----------------------------------------------------------------------
>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/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/app
>> ender/rolling/CronTriggeringPolicy.java
>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/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/e
>> a302f26/log4j-core/src/main/java/org/apache/logging/log4j/co
>> re/appender/rolling/OnStartupTriggeringPolicy.java
>> ----------------------------------------------------------------------
>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/rolling/OnStartupTriggeringPolicy.java
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/rolling/OnStartupTriggeringPolicy.java
>> index a380028..ae7e439 100644
>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/rolling/OnStartupTriggeringPolicy.java
>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/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/e
>> a302f26/log4j-core/src/main/java/org/apache/logging/log4j/co
>> re/appender/rolling/RollingFileManager.java
>> ----------------------------------------------------------------------
>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/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/app
>> ender/rolling/RollingFileManager.java
>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/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/e
>> a302f26/log4j-core/src/main/java/org/apache/logging/log4j/co
>> re/appender/rolling/SizeBasedTriggeringPolicy.java
>> ----------------------------------------------------------------------
>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/rolling/SizeBasedTriggeringPolicy.java
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/rolling/SizeBasedTriggeringPolicy.java
>> index 712d5a6..a0188e7 100644
>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/rolling/SizeBasedTriggeringPolicy.java
>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/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/e
>> a302f26/log4j-core/src/main/java/org/apache/logging/log4j/co
>> re/appender/rolling/TimeBasedTriggeringPolicy.java
>> ----------------------------------------------------------------------
>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/rolling/TimeBasedTriggeringPolicy.java
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/rolling/TimeBasedTriggeringPolicy.java
>> index 2111a77..b9fbdd5 100644
>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/rolling/TimeBasedTriggeringPolicy.java
>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/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/e
>> a302f26/log4j-core/src/main/java/org/apache/logging/log4j/co
>> re/appender/rolling/TriggeringPolicy.java
>> ----------------------------------------------------------------------
>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/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/app
>> ender/rolling/TriggeringPolicy.java
>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/app
>> ender/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
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Reply via email to