Mar*_*tin 13 java logging application-shutdown log4j2
Log4j2还使用关闭挂钩来结束它的服务.但是我当然希望在我的应用程序的整个生命周期中记录 - 包括关闭.使用Log4j这没问题.现在似乎不可能.记录关闭,而我的应用程序仍在处理它.有人对我有什么希望吗?
最好的问候马丁
Cho*_*meh 26
从2.0-beta9开始,现在可以在xml中配置
<configuration ... shutdownHook="disable">
Run Code Online (Sandbox Code Playgroud)
考虑到它现在已禁用,我想我需要在关机钩子结束时手动关闭日志系统.但是我找不到通过外部接口的方法,只在内部api中
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.LoggerContext;
...
public static void main(String[] args) {
final AnnotationConfigApplicationContext springContext = new AnnotationConfigApplicationContext(AppConfig.class)
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
//shutdown application
LOG.info("Shutting down spring context");
springContext.close();
//shutdown log4j2
if( LogManager.getContext() instanceof LoggerContext ) {
logger.info("Shutting down log4j2");
Configurator.shutdown((LoggerContext)LogManager.getContext());
} else
logger.warn("Unable to shutdown log4j2");
}
});
//more application initialization
}
Run Code Online (Sandbox Code Playgroud)
我基本上只回答了同样的问题,而且我很难在这里分享我的答案.我鼓励您阅读此处提供的完整答案.我将尝试在此提供摘要,并根据当前情况调整我的答案.
在第一个版本中,Log4j提供了一个API来手动调用关闭过程.由于我们不了解的原因,它已从第二个版本中删除.现在,正确的方法(根据不存在的文档),提供您自己的ShutdownCallbackRegistry接口实现,负责关闭过程.
我为解决这个问题所做的是我实现了自己的ShutdownCallbackRegistry界面版本.它主要执行与默认实现相同的操作,但不是将自身注册为JVM的关闭挂钩,而是等到手动调用它.
您可以在GitHub/DjDCH/Log4j-StaticShutdown上找到完整的解决方案和说明,并在您自己的项目中使用它.基本上,最后,您只需在应用程序中执行以下操作:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
try {
// Do your usual shutdown stuff here that need logging
} finally {
// Shutdown Log4j 2 manually
StaticShutdownCallbackRegistry.invoke();
}
}
}));
Run Code Online (Sandbox Code Playgroud)
我不能毫无疑问地说这是完美的解决方案,我的实施是完美的,但我试图以正确的方式做到这一点.如果您发现此解决方案适当与否,我将很高兴听到您的反馈.