You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by Remko Popma <re...@gmail.com> on 2016/09/07 15:38:13 UTC
Re: logging-log4j2 git commit: [LOG4J2-1259] Log4j threads are
leaking on tomcat shutdown. TriggeringPolicy now implement LiceCycle which
has a stop(long, TimeUnit) method. This TriggeringPolicy.stop(long, TimeUnit)
method can then be called from RollingFile
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, <gg...@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 <gg...@apache.org>
> Authored: Tue Sep 6 20:03:14 2016 -0400
> Committer: Gary Gregory <gg...@apache.org>
> Committed: Tue Sep 6 20:03:14 2016 -0400
>
> ----------------------------------------------------------------------
> .../rolling/CompositeTriggeringPolicy.java | 169 +++++++--------
> .../appender/rolling/CronTriggeringPolicy.java | 44 +++-
> .../rolling/OnStartupTriggeringPolicy.java | 3 +-
> .../appender/rolling/RollingFileManager.java | 7 +
> .../rolling/SizeBasedTriggeringPolicy.java | 207 +++++++++----------
> .../rolling/TimeBasedTriggeringPolicy.java | 3 +-
> .../core/appender/rolling/TriggeringPolicy.java | 3 +-
> 7 files changed, 232 insertions(+), 204 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/
> core/appender/rolling/CompositeTriggeringPolicy.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/CompositeTriggeringPolicy.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/
> CompositeTriggeringPolicy.java
> index 0ce04de..09133ed 100644
> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/CompositeTriggeringPolicy.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/CompositeTriggeringPolicy.java
> @@ -1,84 +1,85 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements. See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache license, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License. You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - * See the license for the specific language governing permissions and
> - * limitations under the license.
> - */
> -package org.apache.logging.log4j.core.appender.rolling;
> -
> -import java.util.Arrays;
> -
> -import org.apache.logging.log4j.core.LogEvent;
> -import org.apache.logging.log4j.core.config.plugins.Plugin;
> -import org.apache.logging.log4j.core.config.plugins.PluginElement;
> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
> -
> -/**
> - * Triggering policy that wraps other policies.
> - */
> -@Plugin(name = "Policies", category = "Core", printObject = true)
> -public final class CompositeTriggeringPolicy implements TriggeringPolicy {
> -
> - private final TriggeringPolicy[] triggeringPolicy;
> -
> - private CompositeTriggeringPolicy(final TriggeringPolicy...
> policies) {
> - this.triggeringPolicy = policies;
> - }
> -
> - public TriggeringPolicy[] getTriggeringPolicies() {
> - return triggeringPolicy;
> - }
> -
> - /**
> - * Initializes the policy.
> - * @param manager The RollingFileManager.
> - */
> - @Override
> - public void initialize(final RollingFileManager manager) {
> - for (final TriggeringPolicy policy : triggeringPolicy) {
> - policy.initialize(manager);
> - }
> - }
> -
> - /**
> - * Determines if a rollover should occur.
> - * @param event A reference to the currently event.
> - * @return true if a rollover should occur, false otherwise.
> - */
> - @Override
> - public boolean isTriggeringEvent(final LogEvent event) {
> - for (final TriggeringPolicy policy : triggeringPolicy) {
> - if (policy.isTriggeringEvent(event)) {
> - return true;
> - }
> - }
> - return false;
> - }
> -
> - /**
> - * Create a CompositeTriggeringPolicy.
> - * @param policies The triggering policies.
> - * @return A CompositeTriggeringPolicy.
> - */
> - @PluginFactory
> - public static CompositeTriggeringPolicy createPolicy(
> -
> @PluginElement("Policies") final TriggeringPolicy... policies) {
> - return new CompositeTriggeringPolicy(policies);
> - }
> -
> - @Override
> - public String toString() {
> - return "CompositeTriggeringPolicy(policies=" + Arrays.toString(triggeringPolicy)
> + ")";
> - }
> -
> -}
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements. See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache license, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License. You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the license for the specific language governing permissions and
> + * limitations under the license.
> + */
> +package org.apache.logging.log4j.core.appender.rolling;
> +
> +import java.util.Arrays;
> +
> +import org.apache.logging.log4j.core.AbstractLifeCycle;
> +import org.apache.logging.log4j.core.LogEvent;
> +import org.apache.logging.log4j.core.config.plugins.Plugin;
> +import org.apache.logging.log4j.core.config.plugins.PluginElement;
> +import org.apache.logging.log4j.core.config.plugins.PluginFactory;
> +
> +/**
> + * Triggering policy that wraps other policies.
> + */
> +@Plugin(name = "Policies", category = "Core", printObject = true)
> +public final class CompositeTriggeringPolicy extends AbstractLifeCycle
> implements TriggeringPolicy {
> +
> + private final TriggeringPolicy[] triggeringPolicy;
> +
> + private CompositeTriggeringPolicy(final TriggeringPolicy...
> policies) {
> + this.triggeringPolicy = policies;
> + }
> +
> + public TriggeringPolicy[] getTriggeringPolicies() {
> + return triggeringPolicy;
> + }
> +
> + /**
> + * Initializes the policy.
> + * @param manager The RollingFileManager.
> + */
> + @Override
> + public void initialize(final RollingFileManager manager) {
> + for (final TriggeringPolicy policy : triggeringPolicy) {
> + policy.initialize(manager);
> + }
> + }
> +
> + /**
> + * Determines if a rollover should occur.
> + * @param event A reference to the currently event.
> + * @return true if a rollover should occur, false otherwise.
> + */
> + @Override
> + public boolean isTriggeringEvent(final LogEvent event) {
> + for (final TriggeringPolicy policy : triggeringPolicy) {
> + if (policy.isTriggeringEvent(event)) {
> + return true;
> + }
> + }
> + return false;
> + }
> +
> + /**
> + * Create a CompositeTriggeringPolicy.
> + * @param policies The triggering policies.
> + * @return A CompositeTriggeringPolicy.
> + */
> + @PluginFactory
> + public static CompositeTriggeringPolicy createPolicy(
> +
> @PluginElement("Policies") final TriggeringPolicy... policies) {
> + return new CompositeTriggeringPolicy(policies);
> + }
> +
> + @Override
> + public String toString() {
> + return "CompositeTriggeringPolicy(policies=" + Arrays.toString(triggeringPolicy)
> + ")";
> + }
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/
> core/appender/rolling/CronTriggeringPolicy.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/CronTriggeringPolicy.java b/log4j-core/src/main/java/
> org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
> index c6b2df3..288223c 100644
> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/CronTriggeringPolicy.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/CronTriggeringPolicy.java
> @@ -19,8 +19,11 @@ package org.apache.logging.log4j.core.appender.rolling;
> import java.text.ParseException;
> import java.util.Calendar;
> import java.util.Date;
> +import java.util.concurrent.ExecutionException;
> +import java.util.concurrent.TimeUnit;
> +import java.util.concurrent.TimeoutException;
>
> -import org.apache.logging.log4j.Logger;
> +import org.apache.logging.log4j.core.AbstractLifeCycle;
> import org.apache.logging.log4j.core.LogEvent;
> import org.apache.logging.log4j.core.config.Configuration;
> import org.apache.logging.log4j.core.config.CronScheduledFuture;
> @@ -30,16 +33,14 @@ import org.apache.logging.log4j.core.config.plugins.
> PluginAttribute;
> import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
> import org.apache.logging.log4j.core.config.plugins.PluginFactory;
> import org.apache.logging.log4j.core.util.CronExpression;
> -import org.apache.logging.log4j.status.StatusLogger;
>
> /**
> * Rolls a file over based on a cron schedule.
> */
> @Plugin(name = "CronTriggeringPolicy", category = "Core", printObject =
> true)
> @Scheduled
> -public final class CronTriggeringPolicy implements TriggeringPolicy {
> +public final class CronTriggeringPolicy extends AbstractLifeCycle
> implements TriggeringPolicy {
>
> - private static final Logger LOGGER = StatusLogger.getLogger();
> private static final String defaultSchedule = "0 0 0 * * ?";
> private RollingFileManager manager;
> private final CronExpression cronExpression;
> @@ -57,7 +58,9 @@ public final class CronTriggeringPolicy implements
> TriggeringPolicy {
>
> /**
> * Initializes the policy.
> - * @param aManager The RollingFileManager.
> + *
> + * @param aManager
> + * The RollingFileManager.
> */
> @Override
> public void initialize(final RollingFileManager aManager) {
> @@ -74,7 +77,9 @@ public final class CronTriggeringPolicy implements
> TriggeringPolicy {
>
> /**
> * Determines whether a rollover should occur.
> - * @param event A reference to the currently event.
> + *
> + * @param event
> + * A reference to the currently event.
> * @return true if a rollover should occur.
> */
> @Override
> @@ -88,14 +93,17 @@ public final class CronTriggeringPolicy implements
> TriggeringPolicy {
>
> /**
> * Creates a ScheduledTriggeringPolicy.
> - * @param configuration the Configuration.
> - * @param evaluateOnStartup check if the file should be rolled over
> immediately.
> - * @param schedule the cron expression.
> + *
> + * @param configuration
> + * the Configuration.
> + * @param evaluateOnStartup
> + * check if the file should be rolled over immediately.
> + * @param schedule
> + * the cron expression.
> * @return a ScheduledTriggeringPolicy.
> */
> @PluginFactory
> - public static CronTriggeringPolicy createPolicy(
> - @PluginConfiguration final Configuration configuration,
> + public static CronTriggeringPolicy createPolicy(@PluginConfiguration
> final Configuration configuration,
> @PluginAttribute("evaluateOnStartup") final String
> evaluateOnStartup,
> @PluginAttribute("schedule") final String schedule) {
> CronExpression cronExpression;
> @@ -133,6 +141,20 @@ public final class CronTriggeringPolicy implements
> TriggeringPolicy {
> }
>
> @Override
> + public boolean stop(long timeout, TimeUnit timeUnit) {
> + setStopping();
> + if (future != null) {
> + try {
> + future.get(timeout, timeUnit);
> + } catch (InterruptedException | ExecutionException |
> TimeoutException e) {
> + future.cancel(true);
> + }
> + }
> + setStopped();
> + return true;
> + }
> +
> + @Override
> public String toString() {
> return "CronTriggeringPolicy(schedule=" + cronExpression.getCronExpression()
> + ")";
> }
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/
> core/appender/rolling/OnStartupTriggeringPolicy.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/OnStartupTriggeringPolicy.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/
> OnStartupTriggeringPolicy.java
> index a380028..ae7e439 100644
> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/OnStartupTriggeringPolicy.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/OnStartupTriggeringPolicy.java
> @@ -18,6 +18,7 @@ package org.apache.logging.log4j.core.appender.rolling;
>
> import java.lang.reflect.Method;
>
> +import org.apache.logging.log4j.core.AbstractLifeCycle;
> import org.apache.logging.log4j.core.LogEvent;
> import org.apache.logging.log4j.core.config.plugins.Plugin;
> import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
> @@ -29,7 +30,7 @@ import org.apache.logging.log4j.status.StatusLogger;
> * Triggers a rollover on every restart, but only if the file size is
> greater than zero.
> */
> @Plugin(name = "OnStartupTriggeringPolicy", category = "Core",
> printObject = true)
> -public class OnStartupTriggeringPolicy implements TriggeringPolicy {
> +public class OnStartupTriggeringPolicy extends AbstractLifeCycle
> implements TriggeringPolicy {
>
> private static final long JVM_START_TIME = initStartTime();
>
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/
> core/appender/rolling/RollingFileManager.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/RollingFileManager.java b/log4j-core/src/main/java/
> org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
> index e00319d..be5f2cb 100644
> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/RollingFileManager.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/RollingFileManager.java
> @@ -24,6 +24,7 @@ import java.io.Serializable;
> import java.nio.ByteBuffer;
> import java.util.concurrent.Future;
> import java.util.concurrent.Semaphore;
> +import java.util.concurrent.TimeUnit;
> import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
>
> import org.apache.logging.log4j.core.Layout;
> @@ -173,6 +174,12 @@ public class RollingFileManager extends FileManager {
> }
> }
>
> + @Override
> + public void releaseSub(long timeout, TimeUnit timeUnit) {
> + triggeringPolicy.stop(timeout, timeUnit);
> + super.releaseSub(timeout, timeUnit);
> + }
> +
> public synchronized void rollover() {
> if (rollover(rolloverStrategy)) {
> try {
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/
> core/appender/rolling/SizeBasedTriggeringPolicy.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/SizeBasedTriggeringPolicy.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/
> SizeBasedTriggeringPolicy.java
> index 712d5a6..a0188e7 100644
> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/SizeBasedTriggeringPolicy.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/SizeBasedTriggeringPolicy.java
> @@ -1,106 +1,101 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements. See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache license, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License. You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - * See the license for the specific language governing permissions and
> - * limitations under the license.
> - */
> -package org.apache.logging.log4j.core.appender.rolling;
> -
> -import org.apache.logging.log4j.Logger;
> -import org.apache.logging.log4j.core.LogEvent;
> -import org.apache.logging.log4j.core.config.plugins.Plugin;
> -import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
> -import org.apache.logging.log4j.status.StatusLogger;
> -
> -/**
> - *
> - */
> -@Plugin(name = "SizeBasedTriggeringPolicy", category = "Core",
> printObject = true)
> -public class SizeBasedTriggeringPolicy implements TriggeringPolicy {
> - /**
> - * Allow subclasses access to the status logger without creating
> another instance.
> - */
> - protected static final Logger LOGGER = StatusLogger.getLogger();
> -
> - /**
> - * Rollover threshold size in bytes.
> - */
> - private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // let 10
> MB the default max size
> -
> - private final long maxFileSize;
> -
> - private RollingFileManager manager;
> -
> - /**
> - * Constructs a new instance.
> - */
> - protected SizeBasedTriggeringPolicy() {
> - this.maxFileSize = MAX_FILE_SIZE;
> - }
> -
> - /**
> - * Constructs a new instance.
> - *
> - * @param maxFileSize rollover threshold size in bytes.
> - */
> - protected SizeBasedTriggeringPolicy(final long maxFileSize) {
> - this.maxFileSize = maxFileSize;
> - }
> -
> - public long getMaxFileSize() {
> - return maxFileSize;
> - }
> -
> - /**
> - * Initialize the TriggeringPolicy.
> - * @param aManager The RollingFileManager.
> - */
> - @Override
> - public void initialize(final RollingFileManager aManager) {
> - this.manager = aManager;
> - }
> -
> -
> - /**
> - * Returns true if a rollover should occur.
> - * @param event A reference to the currently event.
> - * @return true if a rollover should take place, false otherwise.
> - */
> - @Override
> - public boolean isTriggeringEvent(final LogEvent event) {
> - final boolean triggered = manager.getFileSize() > maxFileSize;
> - if (triggered) {
> - manager.getPatternProcessor().updateTime();
> - }
> - return triggered;
> - }
> -
> - @Override
> - public String toString() {
> - return "SizeBasedTriggeringPolicy(size=" + maxFileSize + ')';
> - }
> -
> - /**
> - * Create a SizeBasedTriggeringPolicy.
> - * @param size The size of the file before rollover is required.
> - * @return A SizeBasedTriggeringPolicy.
> - */
> - @PluginFactory
> - public static SizeBasedTriggeringPolicy createPolicy(@PluginAttribute("size")
> final String size) {
> -
> - final long maxSize = size == null ? MAX_FILE_SIZE :
> FileSize.parse(size, MAX_FILE_SIZE);
> - return new SizeBasedTriggeringPolicy(maxSize);
> - }
> -
> -}
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements. See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache license, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License. You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the license for the specific language governing permissions and
> + * limitations under the license.
> + */
> +package org.apache.logging.log4j.core.appender.rolling;
> +
> +import org.apache.logging.log4j.core.AbstractLifeCycle;
> +import org.apache.logging.log4j.core.LogEvent;
> +import org.apache.logging.log4j.core.config.plugins.Plugin;
> +import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
> +import org.apache.logging.log4j.core.config.plugins.PluginFactory;
> +
> +/**
> + *
> + */
> +@Plugin(name = "SizeBasedTriggeringPolicy", category = "Core",
> printObject = true)
> +public class SizeBasedTriggeringPolicy extends AbstractLifeCycle
> implements TriggeringPolicy {
> +
> + /**
> + * Rollover threshold size in bytes.
> + */
> + private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // let 10
> MB the default max size
> +
> + private final long maxFileSize;
> +
> + private RollingFileManager manager;
> +
> + /**
> + * Constructs a new instance.
> + */
> + protected SizeBasedTriggeringPolicy() {
> + this.maxFileSize = MAX_FILE_SIZE;
> + }
> +
> + /**
> + * Constructs a new instance.
> + *
> + * @param maxFileSize rollover threshold size in bytes.
> + */
> + protected SizeBasedTriggeringPolicy(final long maxFileSize) {
> + this.maxFileSize = maxFileSize;
> + }
> +
> + public long getMaxFileSize() {
> + return maxFileSize;
> + }
> +
> + /**
> + * Initialize the TriggeringPolicy.
> + * @param aManager The RollingFileManager.
> + */
> + @Override
> + public void initialize(final RollingFileManager aManager) {
> + this.manager = aManager;
> + }
> +
> +
> + /**
> + * Returns true if a rollover should occur.
> + * @param event A reference to the currently event.
> + * @return true if a rollover should take place, false otherwise.
> + */
> + @Override
> + public boolean isTriggeringEvent(final LogEvent event) {
> + final boolean triggered = manager.getFileSize() > maxFileSize;
> + if (triggered) {
> + manager.getPatternProcessor().updateTime();
> + }
> + return triggered;
> + }
> +
> + @Override
> + public String toString() {
> + return "SizeBasedTriggeringPolicy(size=" + maxFileSize + ')';
> + }
> +
> + /**
> + * Create a SizeBasedTriggeringPolicy.
> + * @param size The size of the file before rollover is required.
> + * @return A SizeBasedTriggeringPolicy.
> + */
> + @PluginFactory
> + public static SizeBasedTriggeringPolicy createPolicy(@PluginAttribute("size")
> final String size) {
> +
> + final long maxSize = size == null ? MAX_FILE_SIZE :
> FileSize.parse(size, MAX_FILE_SIZE);
> + return new SizeBasedTriggeringPolicy(maxSize);
> + }
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/
> core/appender/rolling/TimeBasedTriggeringPolicy.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/TimeBasedTriggeringPolicy.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/
> TimeBasedTriggeringPolicy.java
> index 2111a77..b9fbdd5 100644
> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/TimeBasedTriggeringPolicy.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/TimeBasedTriggeringPolicy.java
> @@ -16,6 +16,7 @@
> */
> package org.apache.logging.log4j.core.appender.rolling;
>
> +import org.apache.logging.log4j.core.AbstractLifeCycle;
> import org.apache.logging.log4j.core.LogEvent;
> import org.apache.logging.log4j.core.config.plugins.Plugin;
> import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
> @@ -26,7 +27,7 @@ import org.apache.logging.log4j.core.util.Integers;
> * Rolls a file over based on time.
> */
> @Plugin(name = "TimeBasedTriggeringPolicy", category = "Core",
> printObject = true)
> -public final class TimeBasedTriggeringPolicy implements TriggeringPolicy {
> +public final class TimeBasedTriggeringPolicy extends AbstractLifeCycle
> implements TriggeringPolicy {
>
> private long nextRolloverMillis;
> private final int interval;
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/
> core/appender/rolling/TriggeringPolicy.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/TriggeringPolicy.java b/log4j-core/src/main/java/
> org/apache/logging/log4j/core/appender/rolling/TriggeringPolicy.java
> index 412099b..9f66c36 100644
> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/TriggeringPolicy.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> appender/rolling/TriggeringPolicy.java
> @@ -16,6 +16,7 @@
> */
> package org.apache.logging.log4j.core.appender.rolling;
>
> +import org.apache.logging.log4j.core.LifeCycle;
> import org.apache.logging.log4j.core.LogEvent;
>
> /**
> @@ -23,7 +24,7 @@ import org.apache.logging.log4j.core.LogEvent;
> * occurs. Such conditions include time of day, file size, an
> * external event, the log request or a combination thereof.
> */
> -public interface TriggeringPolicy {
> +public interface TriggeringPolicy extends LifeCycle {
>
> /**
> * Initializes this triggering policy.
>
>
Re: logging-log4j2 git commit: [LOG4J2-1259] Log4j threads are leaking on tomcat shutdown. TriggeringPolicy now implement LiceCycle which has a stop(long, TimeUnit) method. This TriggeringPolicy.stop(long, TimeUnit) method can then be called from RollingFile
Posted by Remko Popma <re...@gmail.com>.
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 <ga...@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 <re...@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, <gg...@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 <gg...@apache.org>
>>> Authored: Tue Sep 6 20:03:14 2016 -0400
>>> Committer: Gary Gregory <gg...@apache.org>
>>> Committed: Tue Sep 6 20:03:14 2016 -0400
>>>
>>> ----------------------------------------------------------------------
>>> .../rolling/CompositeTriggeringPolicy.java | 169 +++++++--------
>>> .../appender/rolling/CronTriggeringPolicy.java | 44 +++-
>>> .../rolling/OnStartupTriggeringPolicy.java | 3 +-
>>> .../appender/rolling/RollingFileManager.java | 7 +
>>> .../rolling/SizeBasedTriggeringPolicy.java | 207 +++++++++----------
>>> .../rolling/TimeBasedTriggeringPolicy.java | 3 +-
>>> .../core/appender/rolling/TriggeringPolicy.java | 3 +-
>>> 7 files changed, 232 insertions(+), 204 deletions(-)
>>> ----------------------------------------------------------------------
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java
>>> ----------------------------------------------------------------------
>>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java
>>> index 0ce04de..09133ed 100644
>>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java
>>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java
>>> @@ -1,84 +1,85 @@
>>> -/*
>>> - * Licensed to the Apache Software Foundation (ASF) under one or more
>>> - * contributor license agreements. See the NOTICE file distributed with
>>> - * this work for additional information regarding copyright ownership.
>>> - * The ASF licenses this file to You under the Apache license, Version 2.0
>>> - * (the "License"); you may not use this file except in compliance with
>>> - * the License. You may obtain a copy of the License at
>>> - *
>>> - * http://www.apache.org/licenses/LICENSE-2.0
>>> - *
>>> - * Unless required by applicable law or agreed to in writing, software
>>> - * distributed under the License is distributed on an "AS IS" BASIS,
>>> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>>> - * See the license for the specific language governing permissions and
>>> - * limitations under the license.
>>> - */
>>> -package org.apache.logging.log4j.core.appender.rolling;
>>> -
>>> -import java.util.Arrays;
>>> -
>>> -import org.apache.logging.log4j.core.LogEvent;
>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginElement;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>> -
>>> -/**
>>> - * Triggering policy that wraps other policies.
>>> - */
>>> -@Plugin(name = "Policies", category = "Core", printObject = true)
>>> -public final class CompositeTriggeringPolicy implements TriggeringPolicy {
>>> -
>>> - private final TriggeringPolicy[] triggeringPolicy;
>>> -
>>> - private CompositeTriggeringPolicy(final TriggeringPolicy... policies) {
>>> - this.triggeringPolicy = policies;
>>> - }
>>> -
>>> - public TriggeringPolicy[] getTriggeringPolicies() {
>>> - return triggeringPolicy;
>>> - }
>>> -
>>> - /**
>>> - * Initializes the policy.
>>> - * @param manager The RollingFileManager.
>>> - */
>>> - @Override
>>> - public void initialize(final RollingFileManager manager) {
>>> - for (final TriggeringPolicy policy : triggeringPolicy) {
>>> - policy.initialize(manager);
>>> - }
>>> - }
>>> -
>>> - /**
>>> - * Determines if a rollover should occur.
>>> - * @param event A reference to the currently event.
>>> - * @return true if a rollover should occur, false otherwise.
>>> - */
>>> - @Override
>>> - public boolean isTriggeringEvent(final LogEvent event) {
>>> - for (final TriggeringPolicy policy : triggeringPolicy) {
>>> - if (policy.isTriggeringEvent(event)) {
>>> - return true;
>>> - }
>>> - }
>>> - return false;
>>> - }
>>> -
>>> - /**
>>> - * Create a CompositeTriggeringPolicy.
>>> - * @param policies The triggering policies.
>>> - * @return A CompositeTriggeringPolicy.
>>> - */
>>> - @PluginFactory
>>> - public static CompositeTriggeringPolicy createPolicy(
>>> - @PluginElement("Policies") final TriggeringPolicy... policies) {
>>> - return new CompositeTriggeringPolicy(policies);
>>> - }
>>> -
>>> - @Override
>>> - public String toString() {
>>> - return "CompositeTriggeringPolicy(policies=" + Arrays.toString(triggeringPolicy) + ")";
>>> - }
>>> -
>>> -}
>>> +/*
>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>> + * contributor license agreements. See the NOTICE file distributed with
>>> + * this work for additional information regarding copyright ownership.
>>> + * The ASF licenses this file to You under the Apache license, Version 2.0
>>> + * (the "License"); you may not use this file except in compliance with
>>> + * the License. You may obtain a copy of the License at
>>> + *
>>> + * http://www.apache.org/licenses/LICENSE-2.0
>>> + *
>>> + * Unless required by applicable law or agreed to in writing, software
>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>>> + * See the license for the specific language governing permissions and
>>> + * limitations under the license.
>>> + */
>>> +package org.apache.logging.log4j.core.appender.rolling;
>>> +
>>> +import java.util.Arrays;
>>> +
>>> +import org.apache.logging.log4j.core.AbstractLifeCycle;
>>> +import org.apache.logging.log4j.core.LogEvent;
>>> +import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> +import org.apache.logging.log4j.core.config.plugins.PluginElement;
>>> +import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>> +
>>> +/**
>>> + * Triggering policy that wraps other policies.
>>> + */
>>> +@Plugin(name = "Policies", category = "Core", printObject = true)
>>> +public final class CompositeTriggeringPolicy extends AbstractLifeCycle implements TriggeringPolicy {
>>> +
>>> + private final TriggeringPolicy[] triggeringPolicy;
>>> +
>>> + private CompositeTriggeringPolicy(final TriggeringPolicy... policies) {
>>> + this.triggeringPolicy = policies;
>>> + }
>>> +
>>> + public TriggeringPolicy[] getTriggeringPolicies() {
>>> + return triggeringPolicy;
>>> + }
>>> +
>>> + /**
>>> + * Initializes the policy.
>>> + * @param manager The RollingFileManager.
>>> + */
>>> + @Override
>>> + public void initialize(final RollingFileManager manager) {
>>> + for (final TriggeringPolicy policy : triggeringPolicy) {
>>> + policy.initialize(manager);
>>> + }
>>> + }
>>> +
>>> + /**
>>> + * Determines if a rollover should occur.
>>> + * @param event A reference to the currently event.
>>> + * @return true if a rollover should occur, false otherwise.
>>> + */
>>> + @Override
>>> + public boolean isTriggeringEvent(final LogEvent event) {
>>> + for (final TriggeringPolicy policy : triggeringPolicy) {
>>> + if (policy.isTriggeringEvent(event)) {
>>> + return true;
>>> + }
>>> + }
>>> + return false;
>>> + }
>>> +
>>> + /**
>>> + * Create a CompositeTriggeringPolicy.
>>> + * @param policies The triggering policies.
>>> + * @return A CompositeTriggeringPolicy.
>>> + */
>>> + @PluginFactory
>>> + public static CompositeTriggeringPolicy createPolicy(
>>> + @PluginElement("Policies") final TriggeringPolicy... policies) {
>>> + return new CompositeTriggeringPolicy(policies);
>>> + }
>>> +
>>> + @Override
>>> + public String toString() {
>>> + return "CompositeTriggeringPolicy(policies=" + Arrays.toString(triggeringPolicy) + ")";
>>> + }
>>> +
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
>>> ----------------------------------------------------------------------
>>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
>>> index c6b2df3..288223c 100644
>>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
>>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
>>> @@ -19,8 +19,11 @@ package org.apache.logging.log4j.core.appender.rolling;
>>> import java.text.ParseException;
>>> import java.util.Calendar;
>>> import java.util.Date;
>>> +import java.util.concurrent.ExecutionException;
>>> +import java.util.concurrent.TimeUnit;
>>> +import java.util.concurrent.TimeoutException;
>>>
>>> -import org.apache.logging.log4j.Logger;
>>> +import org.apache.logging.log4j.core.AbstractLifeCycle;
>>> import org.apache.logging.log4j.core.LogEvent;
>>> import org.apache.logging.log4j.core.config.Configuration;
>>> import org.apache.logging.log4j.core.config.CronScheduledFuture;
>>> @@ -30,16 +33,14 @@ import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
>>> import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
>>> import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>> import org.apache.logging.log4j.core.util.CronExpression;
>>> -import org.apache.logging.log4j.status.StatusLogger;
>>>
>>> /**
>>> * Rolls a file over based on a cron schedule.
>>> */
>>> @Plugin(name = "CronTriggeringPolicy", category = "Core", printObject = true)
>>> @Scheduled
>>> -public final class CronTriggeringPolicy implements TriggeringPolicy {
>>> +public final class CronTriggeringPolicy extends AbstractLifeCycle implements TriggeringPolicy {
>>>
>>> - private static final Logger LOGGER = StatusLogger.getLogger();
>>> private static final String defaultSchedule = "0 0 0 * * ?";
>>> private RollingFileManager manager;
>>> private final CronExpression cronExpression;
>>> @@ -57,7 +58,9 @@ public final class CronTriggeringPolicy implements TriggeringPolicy {
>>>
>>> /**
>>> * Initializes the policy.
>>> - * @param aManager The RollingFileManager.
>>> + *
>>> + * @param aManager
>>> + * The RollingFileManager.
>>> */
>>> @Override
>>> public void initialize(final RollingFileManager aManager) {
>>> @@ -74,7 +77,9 @@ public final class CronTriggeringPolicy implements TriggeringPolicy {
>>>
>>> /**
>>> * Determines whether a rollover should occur.
>>> - * @param event A reference to the currently event.
>>> + *
>>> + * @param event
>>> + * A reference to the currently event.
>>> * @return true if a rollover should occur.
>>> */
>>> @Override
>>> @@ -88,14 +93,17 @@ public final class CronTriggeringPolicy implements TriggeringPolicy {
>>>
>>> /**
>>> * Creates a ScheduledTriggeringPolicy.
>>> - * @param configuration the Configuration.
>>> - * @param evaluateOnStartup check if the file should be rolled over immediately.
>>> - * @param schedule the cron expression.
>>> + *
>>> + * @param configuration
>>> + * the Configuration.
>>> + * @param evaluateOnStartup
>>> + * check if the file should be rolled over immediately.
>>> + * @param schedule
>>> + * the cron expression.
>>> * @return a ScheduledTriggeringPolicy.
>>> */
>>> @PluginFactory
>>> - public static CronTriggeringPolicy createPolicy(
>>> - @PluginConfiguration final Configuration configuration,
>>> + public static CronTriggeringPolicy createPolicy(@PluginConfiguration final Configuration configuration,
>>> @PluginAttribute("evaluateOnStartup") final String evaluateOnStartup,
>>> @PluginAttribute("schedule") final String schedule) {
>>> CronExpression cronExpression;
>>> @@ -133,6 +141,20 @@ public final class CronTriggeringPolicy implements TriggeringPolicy {
>>> }
>>>
>>> @Override
>>> + public boolean stop(long timeout, TimeUnit timeUnit) {
>>> + setStopping();
>>> + if (future != null) {
>>> + try {
>>> + future.get(timeout, timeUnit);
>>> + } catch (InterruptedException | ExecutionException | TimeoutException e) {
>>> + future.cancel(true);
>>> + }
>>> + }
>>> + setStopped();
>>> + return true;
>>> + }
>>> +
>>> + @Override
>>> public String toString() {
>>> return "CronTriggeringPolicy(schedule=" + cronExpression.getCronExpression() + ")";
>>> }
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
>>> ----------------------------------------------------------------------
>>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
>>> index a380028..ae7e439 100644
>>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
>>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
>>> @@ -18,6 +18,7 @@ package org.apache.logging.log4j.core.appender.rolling;
>>>
>>> import java.lang.reflect.Method;
>>>
>>> +import org.apache.logging.log4j.core.AbstractLifeCycle;
>>> import org.apache.logging.log4j.core.LogEvent;
>>> import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
>>> @@ -29,7 +30,7 @@ import org.apache.logging.log4j.status.StatusLogger;
>>> * Triggers a rollover on every restart, but only if the file size is greater than zero.
>>> */
>>> @Plugin(name = "OnStartupTriggeringPolicy", category = "Core", printObject = true)
>>> -public class OnStartupTriggeringPolicy implements TriggeringPolicy {
>>> +public class OnStartupTriggeringPolicy extends AbstractLifeCycle implements TriggeringPolicy {
>>>
>>> private static final long JVM_START_TIME = initStartTime();
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
>>> ----------------------------------------------------------------------
>>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
>>> index e00319d..be5f2cb 100644
>>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
>>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
>>> @@ -24,6 +24,7 @@ import java.io.Serializable;
>>> import java.nio.ByteBuffer;
>>> import java.util.concurrent.Future;
>>> import java.util.concurrent.Semaphore;
>>> +import java.util.concurrent.TimeUnit;
>>> import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
>>>
>>> import org.apache.logging.log4j.core.Layout;
>>> @@ -173,6 +174,12 @@ public class RollingFileManager extends FileManager {
>>> }
>>> }
>>>
>>> + @Override
>>> + public void releaseSub(long timeout, TimeUnit timeUnit) {
>>> + triggeringPolicy.stop(timeout, timeUnit);
>>> + super.releaseSub(timeout, timeUnit);
>>> + }
>>> +
>>> public synchronized void rollover() {
>>> if (rollover(rolloverStrategy)) {
>>> try {
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
>>> ----------------------------------------------------------------------
>>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
>>> index 712d5a6..a0188e7 100644
>>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
>>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
>>> @@ -1,106 +1,101 @@
>>> -/*
>>> - * Licensed to the Apache Software Foundation (ASF) under one or more
>>> - * contributor license agreements. See the NOTICE file distributed with
>>> - * this work for additional information regarding copyright ownership.
>>> - * The ASF licenses this file to You under the Apache license, Version 2.0
>>> - * (the "License"); you may not use this file except in compliance with
>>> - * the License. You may obtain a copy of the License at
>>> - *
>>> - * http://www.apache.org/licenses/LICENSE-2.0
>>> - *
>>> - * Unless required by applicable law or agreed to in writing, software
>>> - * distributed under the License is distributed on an "AS IS" BASIS,
>>> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>>> - * See the license for the specific language governing permissions and
>>> - * limitations under the license.
>>> - */
>>> -package org.apache.logging.log4j.core.appender.rolling;
>>> -
>>> -import org.apache.logging.log4j.Logger;
>>> -import org.apache.logging.log4j.core.LogEvent;
>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>> -import org.apache.logging.log4j.status.StatusLogger;
>>> -
>>> -/**
>>> - *
>>> - */
>>> -@Plugin(name = "SizeBasedTriggeringPolicy", category = "Core", printObject = true)
>>> -public class SizeBasedTriggeringPolicy implements TriggeringPolicy {
>>> - /**
>>> - * Allow subclasses access to the status logger without creating another instance.
>>> - */
>>> - protected static final Logger LOGGER = StatusLogger.getLogger();
>>> -
>>> - /**
>>> - * Rollover threshold size in bytes.
>>> - */
>>> - private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // let 10 MB the default max size
>>> -
>>> - private final long maxFileSize;
>>> -
>>> - private RollingFileManager manager;
>>> -
>>> - /**
>>> - * Constructs a new instance.
>>> - */
>>> - protected SizeBasedTriggeringPolicy() {
>>> - this.maxFileSize = MAX_FILE_SIZE;
>>> - }
>>> -
>>> - /**
>>> - * Constructs a new instance.
>>> - *
>>> - * @param maxFileSize rollover threshold size in bytes.
>>> - */
>>> - protected SizeBasedTriggeringPolicy(final long maxFileSize) {
>>> - this.maxFileSize = maxFileSize;
>>> - }
>>> -
>>> - public long getMaxFileSize() {
>>> - return maxFileSize;
>>> - }
>>> -
>>> - /**
>>> - * Initialize the TriggeringPolicy.
>>> - * @param aManager The RollingFileManager.
>>> - */
>>> - @Override
>>> - public void initialize(final RollingFileManager aManager) {
>>> - this.manager = aManager;
>>> - }
>>> -
>>> -
>>> - /**
>>> - * Returns true if a rollover should occur.
>>> - * @param event A reference to the currently event.
>>> - * @return true if a rollover should take place, false otherwise.
>>> - */
>>> - @Override
>>> - public boolean isTriggeringEvent(final LogEvent event) {
>>> - final boolean triggered = manager.getFileSize() > maxFileSize;
>>> - if (triggered) {
>>> - manager.getPatternProcessor().updateTime();
>>> - }
>>> - return triggered;
>>> - }
>>> -
>>> - @Override
>>> - public String toString() {
>>> - return "SizeBasedTriggeringPolicy(size=" + maxFileSize + ')';
>>> - }
>>> -
>>> - /**
>>> - * Create a SizeBasedTriggeringPolicy.
>>> - * @param size The size of the file before rollover is required.
>>> - * @return A SizeBasedTriggeringPolicy.
>>> - */
>>> - @PluginFactory
>>> - public static SizeBasedTriggeringPolicy createPolicy(@PluginAttribute("size") final String size) {
>>> -
>>> - final long maxSize = size == null ? MAX_FILE_SIZE : FileSize.parse(size, MAX_FILE_SIZE);
>>> - return new SizeBasedTriggeringPolicy(maxSize);
>>> - }
>>> -
>>> -}
>>> +/*
>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>> + * contributor license agreements. See the NOTICE file distributed with
>>> + * this work for additional information regarding copyright ownership.
>>> + * The ASF licenses this file to You under the Apache license, Version 2.0
>>> + * (the "License"); you may not use this file except in compliance with
>>> + * the License. You may obtain a copy of the License at
>>> + *
>>> + * http://www.apache.org/licenses/LICENSE-2.0
>>> + *
>>> + * Unless required by applicable law or agreed to in writing, software
>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>>> + * See the license for the specific language governing permissions and
>>> + * limitations under the license.
>>> + */
>>> +package org.apache.logging.log4j.core.appender.rolling;
>>> +
>>> +import org.apache.logging.log4j.core.AbstractLifeCycle;
>>> +import org.apache.logging.log4j.core.LogEvent;
>>> +import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> +import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
>>> +import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>> +
>>> +/**
>>> + *
>>> + */
>>> +@Plugin(name = "SizeBasedTriggeringPolicy", category = "Core", printObject = true)
>>> +public class SizeBasedTriggeringPolicy extends AbstractLifeCycle implements TriggeringPolicy {
>>> +
>>> + /**
>>> + * Rollover threshold size in bytes.
>>> + */
>>> + private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // let 10 MB the default max size
>>> +
>>> + private final long maxFileSize;
>>> +
>>> + private RollingFileManager manager;
>>> +
>>> + /**
>>> + * Constructs a new instance.
>>> + */
>>> + protected SizeBasedTriggeringPolicy() {
>>> + this.maxFileSize = MAX_FILE_SIZE;
>>> + }
>>> +
>>> + /**
>>> + * Constructs a new instance.
>>> + *
>>> + * @param maxFileSize rollover threshold size in bytes.
>>> + */
>>> + protected SizeBasedTriggeringPolicy(final long maxFileSize) {
>>> + this.maxFileSize = maxFileSize;
>>> + }
>>> +
>>> + public long getMaxFileSize() {
>>> + return maxFileSize;
>>> + }
>>> +
>>> + /**
>>> + * Initialize the TriggeringPolicy.
>>> + * @param aManager The RollingFileManager.
>>> + */
>>> + @Override
>>> + public void initialize(final RollingFileManager aManager) {
>>> + this.manager = aManager;
>>> + }
>>> +
>>> +
>>> + /**
>>> + * Returns true if a rollover should occur.
>>> + * @param event A reference to the currently event.
>>> + * @return true if a rollover should take place, false otherwise.
>>> + */
>>> + @Override
>>> + public boolean isTriggeringEvent(final LogEvent event) {
>>> + final boolean triggered = manager.getFileSize() > maxFileSize;
>>> + if (triggered) {
>>> + manager.getPatternProcessor().updateTime();
>>> + }
>>> + return triggered;
>>> + }
>>> +
>>> + @Override
>>> + public String toString() {
>>> + return "SizeBasedTriggeringPolicy(size=" + maxFileSize + ')';
>>> + }
>>> +
>>> + /**
>>> + * Create a SizeBasedTriggeringPolicy.
>>> + * @param size The size of the file before rollover is required.
>>> + * @return A SizeBasedTriggeringPolicy.
>>> + */
>>> + @PluginFactory
>>> + public static SizeBasedTriggeringPolicy createPolicy(@PluginAttribute("size") final String size) {
>>> +
>>> + final long maxSize = size == null ? MAX_FILE_SIZE : FileSize.parse(size, MAX_FILE_SIZE);
>>> + return new SizeBasedTriggeringPolicy(maxSize);
>>> + }
>>> +
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
>>> ----------------------------------------------------------------------
>>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
>>> index 2111a77..b9fbdd5 100644
>>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
>>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
>>> @@ -16,6 +16,7 @@
>>> */
>>> package org.apache.logging.log4j.core.appender.rolling;
>>>
>>> +import org.apache.logging.log4j.core.AbstractLifeCycle;
>>> import org.apache.logging.log4j.core.LogEvent;
>>> import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
>>> @@ -26,7 +27,7 @@ import org.apache.logging.log4j.core.util.Integers;
>>> * Rolls a file over based on time.
>>> */
>>> @Plugin(name = "TimeBasedTriggeringPolicy", category = "Core", printObject = true)
>>> -public final class TimeBasedTriggeringPolicy implements TriggeringPolicy {
>>> +public final class TimeBasedTriggeringPolicy extends AbstractLifeCycle implements TriggeringPolicy {
>>>
>>> private long nextRolloverMillis;
>>> private final int interval;
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea302f26/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TriggeringPolicy.java
>>> ----------------------------------------------------------------------
>>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TriggeringPolicy.java
>>> index 412099b..9f66c36 100644
>>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TriggeringPolicy.java
>>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TriggeringPolicy.java
>>> @@ -16,6 +16,7 @@
>>> */
>>> package org.apache.logging.log4j.core.appender.rolling;
>>>
>>> +import org.apache.logging.log4j.core.LifeCycle;
>>> import org.apache.logging.log4j.core.LogEvent;
>>>
>>> /**
>>> @@ -23,7 +24,7 @@ import org.apache.logging.log4j.core.LogEvent;
>>> * occurs. Such conditions include time of day, file size, an
>>> * external event, the log request or a combination thereof.
>>> */
>>> -public interface TriggeringPolicy {
>>> +public interface TriggeringPolicy extends LifeCycle {
>>>
>>> /**
>>> * Initializes this triggering policy.
>
>
>
> --
> E-Mail: garydgregory@gmail.com | ggregory@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
Re: logging-log4j2 git commit: [LOG4J2-1259] Log4j threads are
leaking on tomcat shutdown. TriggeringPolicy now implement LiceCycle which
has a stop(long, TimeUnit) method. This TriggeringPolicy.stop(long, TimeUnit)
method can then be called from RollingFile
Posted by Gary Gregory <ga...@gmail.com>.
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 <re...@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, <gg...@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 <gg...@apache.org>
>> Authored: Tue Sep 6 20:03:14 2016 -0400
>> Committer: Gary Gregory <gg...@apache.org>
>> Committed: Tue Sep 6 20:03:14 2016 -0400
>>
>> ----------------------------------------------------------------------
>> .../rolling/CompositeTriggeringPolicy.java | 169 +++++++--------
>> .../appender/rolling/CronTriggeringPolicy.java | 44 +++-
>> .../rolling/OnStartupTriggeringPolicy.java | 3 +-
>> .../appender/rolling/RollingFileManager.java | 7 +
>> .../rolling/SizeBasedTriggeringPolicy.java | 207
>> +++++++++----------
>> .../rolling/TimeBasedTriggeringPolicy.java | 3 +-
>> .../core/appender/rolling/TriggeringPolicy.java | 3 +-
>> 7 files changed, 232 insertions(+), 204 deletions(-)
>> ----------------------------------------------------------------------
>>
>>
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/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: garydgregory@gmail.com | ggregory@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