23

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

最好的问候马丁

4

2 回答 2

32

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

<configuration ... shutdownHook="disable">

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

更新:

LogManager.shutdown()从 log4j 版本 2.6 开始就有方法

于 2014-01-31T03:48:27.543 回答
9

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

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

我不能毫无疑问地说这是完美的解决方案,并且我的实现是完美的,但我试图以正确的方式去做。我很高兴听到您的反馈,无论您是否认为此解决方案合适。

于 2015-03-03T16:12:53.757 回答