Servlet上下文销毁事件的日志记录

6

在我的基于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个回答

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

Log4j 2 Web 应用程序支持可配置的日志记录和异步日志写入。它包括一个 Servlet 过滤器和一个侦听器(listener),用于在 Web 应用程序启动时安装 Log4j 2,并在关闭时卸载它。此外,它还提供了一个用于监视应用程序中正在记录的日志消息的 Web 页面。

要将 Log4j 2 添加到 Web 应用程序中,请按照以下步骤操作:

  1. 将 log4j-web 模块添加到 classpath 中。
  2. 确保您的应用程序的 web.xml 文件包括 Log4jServletFilter 和 Log4jServletContextListener。
  3. 使用 log4j2-web.xml 配置文件配置 Log4j 2。

还有没有可能使用tomee maven插件来设置这个? - Shorty123

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

我正在运行在Servlet 3.0容器中,并且没有对Log4j的servlet组件进行任何手动配置。 - Paul Turner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接