如何正确关闭log4j2

use*_*731 13 java logging log4j application-shutdown log4j2

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

Rem*_*pma 13

没有公共API,但你可以使用

((LifeCycle) LogManager.getContext()).stop();
Run Code Online (Sandbox Code Playgroud)

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


更新:

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


DjD*_*DCH 8

背后的解释和故事

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

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

提出的解决方案

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

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

StaticShutdownCallbackRegistry.invoke();
Run Code Online (Sandbox Code Playgroud)

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


leo*_*kom 8

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

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

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>${log4j2.version}</version>
    <scope>runtime</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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