如何使用Log4j2登录关闭钩子?

Log4j2还使用关闭挂钩来结束它的服务。 但是我当然希望在我的应用程序的整个生命周期中记录 – 包括关闭。 使用Log4j这没问题。 现在似乎不可能。 记录关闭,而我的应用程序仍在处理它。 有人对我有什么希望吗?

最好的问候马丁

从2.0-beta9开始,现在可以在xml中配置

 

考虑到它现在被禁用,我想我需要在关机钩子结束时手动关闭日志系统。 但是我找不到通过外部接口的方法,仅在内部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 } 

我基本上只回答了同样的问题,而且我很难在这里分享我的答案。 我鼓励您阅读此处提供的完整答案 。 我将尝试在此提供摘要,并根据当前情况调整我的答案。

在第一个版本中,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(); } } })); 

我不能毫无疑问地说这是完美的解决方案,我的实施是完美的,但我试图以正确的方式做到这一点。 如果您发现此解决方案合适与否,我将很高兴听到您的反馈。