We are migrating to logback from log4j for several web apps. In the shutdown of our application we currently call:
org.apache.log4j.LogManager.shutdown();
Which is supposed to flush all async logging and close all external resources (files, sockets).
Is there something similar in logback or does it somehow flush automatically on shutdown?
Mike
Here's a simple approach:
import org.slf4j.ILoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
...
ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
// Check for logback implementation of slf4j
if (loggerFactory instanceof LoggerContext) {
LoggerContext context = (LoggerContext) loggerFactory;
context.stop();
}
It seems that just adding <shutdownHook/>
into configuration should stop the context.
From logback docs:
<configuration>
<!-- in the absence of the class attribute, assume
ch.qos.logback.core.hook.DelayingShutdownHook -->
<shutdownHook/>
....
</configuration>
And from DelayingShutdownHook summary:
ShutdownHook implementation that stops the Logback context after a specified delay. The default delay is 0 ms (zero).
I'm not aware of an overall manager shutdown like log4j's but I close all my individual context loggers when their context is destroyed using a ServletContextListener like so:
ContextSelector selector = StaticLoggerBinder.getSingleton().getContextSelector();
LoggerContext context = selector.detachLoggerContext(contextName);
if (context != null) {
Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME);
context.reset();
} else {
System.err.printf("No context named %s was found", contextName);
}
Also, LoggerContext.stop() is svailable and does some of the same functions internally but I don't use it, so I can't comment on whether its better than reset or not.
Version 1.1.10 onwards, logback takes care of stopping the current logback-classic context when the web-app is stopped or reloaded.
Here's the updated doc: https://logback.qos.ch/manual/configuration.html#webShutdownHook