从 servlet 上下文销毁事件记录

Pau*_*ner 5 java servlet-3.0 log4j2

在我的基于 Servlet 的应用程序中,我想记录启动和关闭的事件。

我试图实现ServletContextListener接口来做到这一点:

public class DiagnosticListener
    implements ServletContextListener {

    private static final Logger LOG = LogManager.getLogger(DiagnosticListener.class);

    @Override
    public void contextInitialized( final ServletContextEvent sce ) {
        LOG.info("Context initialized.");
    }

    @Override
    public void contextDestroyed( final ServletContextEvent sce ) {
        LOG.info("Context destroyed.");
    }
}
Run Code Online (Sandbox Code Playgroud)

初始化事件按预期记录,但销毁事件从未出现。我假设这与 log4j2 如何使用类似的侦听器管理其生命周期有关,日志基础结构在此事件期间不再可用。

有没有办法记录正在关闭的应用程序的事件?

小智 5

我们与 Logback 发生了类似的问题。您必须编写自己的 web.xml 来解决这个问题,因为没有其他方法可以定义侦听器顺序。

我们禁用了 LogbackServletContextListener :

<context-param>
    <param-name>logbackDisableServletContainerInitializer</param-name>
    <param-value>true</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

然后手动添加 LogbackServletContextListener 作为第一个侦听器:

<listener>
    <listener-class>ch.qos.logback.classic.servlet.LogbackServletContextListener</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

然后是所有其他听众。

不知道 log4j,但我认为有类似的东西......

编辑:是的,有:

<context-param>
    <param-name>isLog4jAutoInitializationDisabled</param-name>
    <param-value>true</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

来源:https : //logging.apache.org/log4j/2.x/manual/webapp.html


rgo*_*ers 0

如果您在 web.xml 中先配置了 Log4j 的 ServletContextListener,那么 Log4j 应该在您的 ServletContextListener 之前初始化,并在您的 ServletContextListener 之后关闭。