Java 如何正确关闭log4j2

Java 如何正确关闭log4j2,java,logging,log4j,log4j2,application-shutdown,Java,Logging,Log4j,Log4j2,Application Shutdown,如果没有在web应用程序中运行,那么关闭Log4j2的正确方法是什么?我只看到一个noop LogManager.shutdown()没有用于此的公共API,但您可以使用 ((LifeCycle) LogManager.getContext()).stop(); 如果您对此有兴趣使用公共API,请投票支持或在此处添加评论: 更新: 在Log4j 2.5中,您可以调用Configurator.shutdown()。使用Log4j 2.6,您可以调用LogManager.shutdown()解释

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

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

((LifeCycle) LogManager.getContext()).stop();
如果您对此有兴趣使用公共API,请投票支持或在此处添加评论:


更新:

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

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

根据Log4j 2 bug tracker(and)上的一些问题,正确的方法是提供自己的
ShutdownCallbackRegistry
接口实现。由于没有用于关闭log4j2的公共API,因此这是唯一真正有效的归档方法

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

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

StaticShutdownCallbackRegistry.invoke();

我不能毫无疑问地说这是一个完美的解决方案,我的实现也很完美,但我尝试了正确的方法(根据不存在的文档)。我很高兴听到您的反馈,无论您是否认为此解决方案合适。

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

要启用它,请将这样的依赖项添加到pom.xml中

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

org.apache.logging.log4j

看起来2.6版重新添加了一个正确的手册
。关机
,有人能确认吗?在这里它实际上不起作用,您应该向log4j2.xml中添加
shutdownHook=“disable”
,以禁用自动关闭钩子。请注意,这个问题特别是关于“一个未在web应用程序中运行”的情况[emphasis mine]你说得对,鲁卡不管怎么说都会留下答案,因为有些人认为这对他们的案子有用。