Log4j 2 already has a way to disable the shutdown hook. It also already has a way to allow you to manually shutdown via Configurator.shutdown(). We are simply trying to add the api method to LogManager - which requires a change to the API’s LoggerContext.
Ralph > On Jan 25, 2016, at 5:06 PM, Guido Medina <[email protected]> wrote: > > Due to current implementation I think start lazy shouldn't be changed or else > you will introduce another life-cycle mayhem, instead add a configuration > property to enable/disable shutdown hook and add stop method: > > I have micro-services in Akka for example with ActorSystem.shutdown under a > JVM shutdown hook and sometimes Log4j2 stops before Akka, in that scenario I > would like to disable Log4j2 shutdown hook and call stop myself. > > Hope that makes sense, > > Guido. > > On Tue, Jan 26, 2016 at 12:00 AM, Matt Sicker <[email protected] > <mailto:[email protected]>> wrote: > Lifecycle/LifeCycle is the closest thing I see already in log4j and Spring. > Camel has an interface called ShutdownableService which is similar (but > extends their Service interface). > > Other projects: > * CXF uses the Bus interface which has a shutdown method. > * OSGi has Bundle.stop() which is rather similar to a generic Lifecycle > interface overall > * Hadoop has a Service interface with a stop() method > * Tomcat as a Lifecycle interface with a stop() method > > I mean the basic idea I'm seeing here is that nobody seems to make a class > with a stop-style method without an accompanying start-style method. > > On 25 January 2016 at 17:35, Gary Gregory <[email protected] > <mailto:[email protected]>> wrote: > I see some interfaces with "*Capable*" in the name here and there in the FOSS > world (but not in the JRE) so I am a little more comfortable with it. > > I still see plain old "Shutdown" as simpler. > > I think I've boiled down my feel for this name to the fact that the Capable > postfix is redundant since a class implementing any interface is "capable" of > that functionality. IOW we have Serializable vs. SerializationCabable, which > means the same thing. > > Gary > > On Mon, Jan 25, 2016 at 7:27 AM, Ralph Goers <[email protected] > <mailto:[email protected]>> wrote: > What does it feel weird to you? To be honest, I originally named the > interface ‘Shutdown” and then changed it since it really is about > implementing a behavior and “Shutdown” alone doesn’t really describe that. > > Ralph > >> On Jan 24, 2016, at 11:09 PM, Gary Gregory <[email protected] >> <mailto:[email protected]>> wrote: >> >> On Sun, Jan 24, 2016 at 10:07 PM, Gary Gregory <[email protected] >> <mailto:[email protected]>> wrote: >> On Sun, Jan 24, 2016 at 1:54 PM, Ralph Goers <[email protected] >> <mailto:[email protected]>> wrote: >> Yes, Shutdownable is too weird. >> >> How about calling it simply "Shutdown" then? FooCapable feels weird to me. >> >> Can anyone think of other (one-method or not) optional feature-like >> interfaces in the JRE or other code base? >> >> hm... ShutdownService? >> >> Gary >> >> >> Gary >> >> Closeable would imply there is a close method, not a shutdown method. I >> have my doubts about the try-with-resources use case here. Virtually all >> usages are probably going to be to disable automatic shutdown and then the >> user placing the shutdown call somewhere they can control, which probably >> will have nothing to do with initialization of logging. >> >> Ralph >> >>> On Jan 24, 2016, at 2:43 PM, Gary Gregory <[email protected] >>> <mailto:[email protected]>> wrote: >>> >>> Resending, got a error from my phone... >>> >>> ---------- Forwarded message ---------- >>> From: "Gary Gregory" <[email protected] >>> <mailto:[email protected]>> >>> Date: Jan 24, 2016 1:41 PM >>> Subject: Re: logging-log4j2 git commit: LOG4J2-124 - Add shutdown methods >>> to LogManager >>> To: <[email protected] <mailto:[email protected]>> >>> Cc: >>> >>> Hi all, >>> >>> Any reason not use the usual -able postfix instead of ShutdownCapable: >>> Shutdownable sounds too weird? What about reusing plain old Closeable? That >>> means you could use the context in a try-with-resources block, a bonus. >>> >>> Gary >>> >>> On Jan 24, 2016 10:18 AM, <[email protected] <mailto:[email protected]>> >>> wrote: >>> Repository: logging-log4j2 >>> Updated Branches: >>> refs/heads/master 7d3aac4b9 -> 2df3f0e72 >>> >>> >>> LOG4J2-124 - Add shutdown methods to LogManager >>> >>> >>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo >>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo> >>> Commit: >>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/2df3f0e7 >>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/2df3f0e7> >>> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/2df3f0e7 >>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/2df3f0e7> >>> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/2df3f0e7 >>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/2df3f0e7> >>> >>> Branch: refs/heads/master >>> Commit: 2df3f0e7262c90e3fe1700f053eebf18491650d9 >>> Parents: 7d3aac4 >>> Author: Ralph Goers <[email protected] <mailto:[email protected]>> >>> Authored: Sun Jan 24 11:18:41 2016 -0700 >>> Committer: Ralph Goers <[email protected] <mailto:[email protected]>> >>> Committed: Sun Jan 24 11:18:41 2016 -0700 >>> >>> ---------------------------------------------------------------------- >>> .../org/apache/logging/log4j/LogManager.java | 62 ++++++++++++++++++++ >>> .../logging/log4j/spi/ShutdownCapable.java | 17 ++++++ >>> .../apache/logging/log4j/LogManagerTest.java | 7 +++ >>> .../logging/log4j/core/LoggerContext.java | 8 ++- >>> 4 files changed, 93 insertions(+), 1 deletion(-) >>> ---------------------------------------------------------------------- >>> >>> >>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java >>> >>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java> >>> ---------------------------------------------------------------------- >>> diff --git >>> a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java >>> b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java >>> index f10e5a8..64c6ee5 100644 >>> --- a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java >>> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java >>> @@ -27,6 +27,7 @@ import >>> org.apache.logging.log4j.simple.SimpleLoggerContextFactory; >>> import org.apache.logging.log4j.spi.LoggerContext; >>> import org.apache.logging.log4j.spi.LoggerContextFactory; >>> import org.apache.logging.log4j.spi.Provider; >>> +import org.apache.logging.log4j.spi.ShutdownCapable; >>> import org.apache.logging.log4j.status.StatusLogger; >>> import org.apache.logging.log4j.util.LoaderUtil; >>> import org.apache.logging.log4j.util.PropertiesUtil; >>> @@ -285,6 +286,67 @@ public class LogManager { >>> } >>> >>> /** >>> + * Shutdown using the default LoggerContext. >>> + * @since 2.6 >>> + */ >>> + public static void shutdown() { >>> + shutdown(getContext()); >>> + } >>> + >>> + /** >>> + * Shutdown the logging system if the logging system supports it. >>> + * @param currentContext if true the LoggerContext for the caller of >>> this method will be used. >>> + * @since 2.6 >>> + */ >>> + public static void shutdown(boolean currentContext) { >>> + shutdown(getContext(currentContext)); >>> + } >>> + >>> + /** >>> + * Shutdown the logging system if the logging system supports it. >>> + * @param loader The ClassLoader for the context. If null the context >>> will attempt to determine the appropriate >>> + * ClassLoader. >>> + * @param currentContext if false the LoggerContext appropriate for >>> the caller of this method will be used. >>> + * @since 2.6 >>> + */ >>> + public static void shutdown(final ClassLoader loader, final boolean >>> currentContext) { >>> + shutdown(getContext(loader, currentContext)); >>> + } >>> + >>> + /** >>> + * Shutdown the logging system if the logging system supports it. >>> + * @param context the LoggerContext. >>> + * @since 2.6 >>> + */ >>> + public static void shutdown(LoggerContext context) { >>> + if (context != null && context instanceof ShutdownCapable) { >>> + ((ShutdownCapable) context).shutdown(); >>> + } >>> + } >>> + >>> + /** >>> + * Shutdown the logging system if the logging system supports it. >>> + * @param fqcn The fully qualified class name of the Class that this >>> method is a member of. >>> + * @param currentContext if false the LoggerContext appropriate for >>> the caller of this method will be used. >>> + * @since 2.6 >>> + */ >>> + protected static void shutdown(final String fqcn, final boolean >>> currentContext) { >>> + shutdown(getContext(fqcn, currentContext)); >>> + } >>> + >>> + /** >>> + * Shutdown the logging system if the logging system supports it. >>> + * @param fqcn The fully qualified class name of the Class that this >>> method is a member of. >>> + * @param loader The ClassLoader for the context. If null the context >>> will attempt to determine the appropriate >>> + * ClassLoader. >>> + * @param currentContext if false the LoggerContext appropriate for >>> the caller of this method will be used. >>> + * @since 2.6 >>> + */ >>> + protected static void shutdown(final String fqcn, final ClassLoader >>> loader, final boolean currentContext) { >>> + shutdown(getContext(fqcn, loader, currentContext)); >>> + } >>> + >>> + /** >>> * Returns the current LoggerContextFactory. >>> * >>> * @return The LoggerContextFactory. >>> >>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java >>> >>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java> >>> ---------------------------------------------------------------------- >>> diff --git >>> a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java >>> b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java >>> new file mode 100644 >>> index 0000000..a46ef60 >>> --- /dev/null >>> +++ >>> b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java >>> @@ -0,0 +1,17 @@ >>> +/* >>> + * Copyright (c) 2016 Nextiva, Inc. to Present. >>> + * All rights reserved. >>> + */ >>> +package org.apache.logging.log4j.spi; >>> + >>> +/** >>> + * Interface to be implemented by LoggerContext's that provide a shutdown >>> method. >>> + * @since 2.6 >>> + */ >>> +public interface ShutdownCapable { >>> + >>> + /** >>> + * Requests that the logging implementation shut down. >>> + */ >>> + void shutdown(); >>> +} >>> >>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java >>> >>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java> >>> ---------------------------------------------------------------------- >>> diff --git >>> a/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java >>> b/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java >>> index 48f0eea..596a9f2 100644 >>> --- a/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java >>> +++ b/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java >>> @@ -17,6 +17,7 @@ >>> package org.apache.logging.log4j; >>> >>> import org.apache.logging.log4j.message.ParameterizedMessageFactory; >>> +import org.apache.logging.log4j.spi.LoggerContext; >>> import org.junit.Test; >>> >>> import static org.junit.Assert.*; >>> @@ -53,4 +54,10 @@ public class LogManagerTest { >>> assertNotNull("No Logger returned", logger); >>> assertTrue("Incorrect Logger name: " + >>> logger.getName(),LogManagerTest.class.getName().equals(logger.getName())); >>> } >>> + >>> + @Test >>> + public void testShutdown() { >>> + LoggerContext loggerContext = LogManager.getContext(false); >>> + LogManager.shutdown(loggerContext); >>> + } >>> } >>> >>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java >>> >>> <http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java> >>> ---------------------------------------------------------------------- >>> diff --git >>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java >>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java >>> index 42efbb5..fcdfc16 100644 >>> --- >>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java >>> +++ >>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java >>> @@ -45,6 +45,7 @@ import org.apache.logging.log4j.message.MessageFactory; >>> import org.apache.logging.log4j.spi.AbstractLogger; >>> import org.apache.logging.log4j.spi.LoggerContextFactory; >>> import org.apache.logging.log4j.spi.LoggerContextKey; >>> +import org.apache.logging.log4j.spi.ShutdownCapable; >>> >>> import static >>> org.apache.logging.log4j.core.util.ShutdownCallbackRegistry.*; >>> >>> @@ -54,7 +55,7 @@ import static >>> org.apache.logging.log4j.core.util.ShutdownCallbackRegistry.*; >>> * filters, etc and will be atomically updated whenever a reconfigure >>> occurs. >>> */ >>> public class LoggerContext extends AbstractLifeCycle implements >>> org.apache.logging.log4j.spi.LoggerContext, >>> - ConfigurationListener { >>> + ShutdownCapable, ConfigurationListener { >>> >>> /** >>> * Property name of the property change event fired if the >>> configuration is changed. >>> @@ -278,6 +279,11 @@ public class LoggerContext extends AbstractLifeCycle >>> implements org.apache.loggi >>> } >>> >>> @Override >>> + public void shutdown() { >>> + stop(); >>> + } >>> + >>> + @Override >>> public void stop() { >>> LOGGER.debug("Stopping LoggerContext[name={}, {}]...", getName(), >>> this); >>> configLock.lock(); >>> >> >> >> >> >> -- >> E-Mail: [email protected] <mailto:[email protected]> | >> [email protected] <mailto:[email protected]> >> 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 <http://garygregory.wordpress.com/> >> Home: http://garygregory.com/ <http://garygregory.com/> >> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory> >> >> >> -- >> E-Mail: [email protected] <mailto:[email protected]> | >> [email protected] <mailto:[email protected]> >> 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 <http://garygregory.wordpress.com/> >> Home: http://garygregory.com/ <http://garygregory.com/> >> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory> > > > > -- > E-Mail: [email protected] <mailto:[email protected]> | > [email protected] <mailto:[email protected]> > 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 <http://garygregory.wordpress.com/> > Home: http://garygregory.com/ <http://garygregory.com/> > Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory> > > > -- > Matt Sicker <[email protected] <mailto:[email protected]>> >
