我们正在从log4j迁移到几个Web应用程序的logback。在关闭我们的应用程序时,我们目前致电:
org.apache.log4j.LogManager.shutdown();
应该刷新所有异步日志记录并关闭所有外部资源(文件,套接字)。
在logback中是否存在类似的内容,或者在关闭时是否会以某种方式自动刷新?
麦克
答案 0 :(得分:7)
这是一个简单的方法:
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();
}
答案 1 :(得分:7)
似乎只需在配置中添加<shutdownHook/>
即可停止上下文。
来自logback docs:
<configuration>
<!-- in the absence of the class attribute, assume
ch.qos.logback.core.hook.DelayingShutdownHook -->
<shutdownHook/>
....
</configuration>
来自DelayingShutdownHook summary:
ShutdownHook实现,在指定的延迟后停止Logback上下文。默认延迟为0 ms(零)。
答案 2 :(得分:0)
我不知道像log4j这样的整体管理器关闭,但是当使用像这样的ServletContextListener销毁它们的上下文时,我关闭了所有单独的上下文记录器:
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);
}
此外,LoggerContext.stop()是可用的,并在内部执行一些相同的功能,但我不使用它,所以我不能评论它是否比重置更好。
答案 3 :(得分:0)
1.1.10版以后,当web-app停止或重新加载时,logback负责停止当前的logback-classic上下文。
此处有更新的文档:https://logback.qos.ch/manual/configuration.html#webShutdownHook