【问题标题】:Logging from servlet context destroyed event从 servlet 上下文销毁事件记录
【发布时间】:2016-06-01 00:43:42
【问题描述】:

在我的基于 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 如何使用类似的侦听器管理其生命周期有关,在此事件期间日志基础设施不再可用。

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

【问题讨论】:

    标签: java log4j2 servlet-3.0


    【解决方案1】:

    我们在 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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我在 Servlet 3.0 容器中运行,还没有对 Log4j 的 servlet 组件进行任何手动配置。
      猜你喜欢
      • 1970-01-01
      • 2022-12-18
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      相关资源
      最近更新 更多