从servlet上下文记录销毁事件

时间:2016-06-01 00:43:43

标签: java log4j2 servlet-3.0

在我的基于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.");
    }
}

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

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

2 个答案:

答案 0 :(得分:2)

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

我们使用以下命令禁用了LogbackServletContextListener:

<context-param>
    <param-name>logbackDisableServletContainerInitializer</param-name>
    <param-value>true</param-value>
</context-param>

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

<listener>
    <listener-class>ch.qos.logback.classic.servlet.LogbackServletContextListener</listener-class>
</listener>

然后是所有其他听众。

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

编辑:是的,有:

<context-param>
    <param-name>isLog4jAutoInitializationDisabled</param-name>
    <param-value>true</param-value>
</context-param>

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

答案 1 :(得分:0)

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