如何正确关闭log4j2

时间:2014-09-16 19:40:42

标签: java logging log4j log4j2 application-shutdown

如果没有在Web应用程序中运行,关闭Log4j2的正确方法是什么?我只看到一个noop LogManager.shutdown()

3 个答案:

答案 0 :(得分:11)

此处没有公共API,但您可以使用

((LifeCycle) LogManager.getContext()).stop();

如果您有兴趣为此设置公开API,请在此投票或添加评论:https://issues.apache.org/jira/browse/LOG4J2-124


更新

在Log4j 2.5中,您可以拨打Configurator.shutdown()。使用Log4j 2.6,您可以拨打LogManager.shutdown()

答案 1 :(得分:8)

背后的解释和故事

Log4j 2内部使用的是他们所谓的 ShutdownRegistrationStrategy 。它由一个类组成,该类注册将在适当的时间调用的一个或多个关闭回调。它们提供名为ShutdownCallbackRegistry的接口及其名为DefaultShutdownCallbackRegistry的默认实现。此实现将自身注册为JVM的关闭挂钩,使用Runtime.getRuntime().addShutdownHook()

根据Log4j 2错误跟踪器(LOG4J2-868LOG4J2-658)上的一些问题,正确的方法是提供您自己的ShutdownCallbackRegistry接口实现。由于没有关闭Log4j 2的公共API,因此这是唯一真实有效的归档方式。

提议的解决方案

所以,我做的是解决这个问题,即我实现了自己的ShutdownCallbackRegistry接口版本。它主要执行与默认实现相同的操作,但不是将自己注册为关闭挂钩,而是等到手动调用它。通过将对象的实例保持在静态字段中,可以在内部实现这一点。然后,您只需要调用单个静态方法来启动关闭过程,因此我将其命名为StaticShutdownCallbackRegistry

您可以在GitHub/DjDCH/Log4j-StaticShutdown找到完整的解决方案和说明,并在您自己的项目中使用它。基本上,最后,您只需在应用程序中执行以下操作:

StaticShutdownCallbackRegistry.invoke();

我不能毫无疑问地说这是完美的解决方案而且我的实现是完美的,但我试图以正确的方式做到(根据不存在的文档)。如果您发现此解决方案合适,我将很高兴听到您的反馈。

答案 2 :(得分:7)

Log4j-Web 库是正确清理Web应用程序中资源的首选方法。

要启用它,请将此依赖项添加到pom.xml

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>${log4j2.version}</version>
    <scope>runtime</scope>
</dependency>

它将在Servlet 3. *环境中“开箱即用”。 如果您使用的是较旧的Servlet规范,请在此处详细说明如何为log4j2启用正确的清理: https://logging.apache.org/log4j/2.x/manual/webapp.html