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