OK, done. On Wed, Jan 27, 2016 at 6:17 AM, Remko Popma <[email protected]> wrote:
> Mikael, feel free to update the javadoc when you have time. > > > On Wednesday, 27 January 2016, Remko Popma <[email protected]> wrote: > >> Since the async loggers and appenders will wait until their queue has >> been cleared by the background thread, it is a blocking call. >> >> We should probably add a sentence to the java doc to clarify this. >> >> Sent from my iPhone >> >> On 2016/01/26, at 18:15, Mikael Ståldal <[email protected]> >> wrote: >> >> I think that we should be clear, in Javadoc, about whether this new >> method is synchronous/blocking or not. >> >> (I could say the same about quite a few existing methods as well, but >> let's at least start to be clear about new methods from now.) >> >> On Tue, Jan 26, 2016 at 1:31 AM, Matt Sicker <[email protected]> wrote: >> >>> I like it! >>> >>> On 25 January 2016 at 18:23, Ralph Goers <[email protected]> >>> wrote: >>> >>>> Then the method name would be terminate? I could live with that. I >>>> also like the fact that when something goes wrong with it then it would be >>>> interminable ;-) >>>> >>>> Ralph >>>> >>>> On Jan 25, 2016, at 5:18 PM, Matt Sicker <[email protected]> wrote: >>>> >>>> How about Terminable? It's even a real word to boot. >>>> >>>> On 25 January 2016 at 18:15, Ralph Goers <[email protected]> >>>> wrote: >>>> >>>>> Yes, well - Serializable actually sounds like it should be a real >>>>> word. Shutdownable doesn’t - in fact, my mail editor just split it into >>>>> two >>>>> words to “help” me. I take a different view. A class that declares it >>>>> implements an interface isn’t “capable” of anything - it just implements >>>>> the interface. The interface name is what tells you that the implementing >>>>> class is able to do something, which is why you have Comparable instead of >>>>> just Compare, Cloneable instead of just Clone, or Closeable instead of >>>>> just Close. Would you want Stop instead of Stoppable? I view “able” as >>>>> just a shorthand way of saying “Capable”, but unfortunately that just >>>>> doesn’t sound right with Shutdown (at least to me). >>>>> >>>>> Here are some “able” alternatives - presumably each would have a >>>>> corresponding method name instead of shutdown: >>>>> Terminateable. >>>>> Completeable. >>>>> Concludeable. >>>>> Haltable. >>>>> Dismissable. >>>>> Expireable. >>>>> >>>>> I suppose we could also use Stoppable but that seems odd since stop is >>>>> part of Lifecycle. >>>>> >>>>> Got a preference? >>>>> >>>>> Ralph >>>>> >>>>> >>>>> >>>>> On Jan 25, 2016, at 4:35 PM, Gary Gregory <[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]> 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]> >>>>>> wrote: >>>>>> >>>>>> On Sun, Jan 24, 2016 at 10:07 PM, Gary Gregory < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> On Sun, Jan 24, 2016 at 1:54 PM, Ralph Goers < >>>>>>> [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]> >>>>>>>> wrote: >>>>>>>> >>>>>>>> Resending, got a error from my phone... >>>>>>>> ---------- Forwarded message ---------- >>>>>>>> From: "Gary Gregory" <[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]> >>>>>>>> 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]> 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 >>>>>>>>> Commit: >>>>>>>>> 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 >>>>>>>>> Diff: >>>>>>>>> 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]> >>>>>>>>> Authored: Sun Jan 24 11:18:41 2016 -0700 >>>>>>>>> Committer: Ralph Goers <[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 >>>>>>>>> >>>>>>>>> ---------------------------------------------------------------------- >>>>>>>>> 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 >>>>>>>>> >>>>>>>>> ---------------------------------------------------------------------- >>>>>>>>> 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 >>>>>>>>> >>>>>>>>> ---------------------------------------------------------------------- >>>>>>>>> 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 >>>>>>>>> >>>>>>>>> ---------------------------------------------------------------------- >>>>>>>>> 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] | [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 >>>>>>> Home: http://garygregory.com/ >>>>>>> Tweet! http://twitter.com/GaryGregory >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> E-Mail: [email protected] | [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 >>>>>> Home: http://garygregory.com/ >>>>>> Tweet! http://twitter.com/GaryGregory >>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> E-Mail: [email protected] | [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 >>>>> Home: http://garygregory.com/ >>>>> Tweet! http://twitter.com/GaryGregory >>>>> >>>>> >>>>> >>>> >>>> >>>> -- >>>> Matt Sicker <[email protected]> >>>> >>>> >>>> >>> >>> >>> -- >>> Matt Sicker <[email protected]> >>> >> >> >> >> -- >> [image: MagineTV] >> >> *Mikael Ståldal* >> Senior software developer >> >> *Magine TV* >> [email protected] >> Grev Turegatan 3 | 114 46 Stockholm, Sweden | www.magine.com >> >> Privileged and/or Confidential Information may be contained in this >> message. If you are not the addressee indicated in this message >> (or responsible for delivery of the message to such a person), you may >> not copy or deliver this message to anyone. In such case, >> you should destroy this message and kindly notify the sender by reply >> email. >> >> -- [image: MagineTV] *Mikael Ståldal* Senior software developer *Magine TV* [email protected] Grev Turegatan 3 | 114 46 Stockholm, Sweden | www.magine.com Privileged and/or Confidential Information may be contained in this message. If you are not the addressee indicated in this message (or responsible for delivery of the message to such a person), you may not copy or deliver this message to anyone. In such case, you should destroy this message and kindly notify the sender by reply email.
