web-applications - Log4j2:无法使用 Servlet 上下文监听器设置 MDC key

标签 web-applications log4j2 mdc

我正在尝试使用 Servlet 上下文监听器将主机名设置为 MDC 变量。 MDC 变量仅在监听器本身中可用,但如果我尝试从其他 servlet 登录,它就会消失。

这是我的监听器代码:

public class MdcServletListener implements ServletContextListener {

    /** logger. */
    private static Logger logger = LoggerFactory
            .getLogger(MdcServletListener.class);

    /*
     * (non-Javadoc)
     * 
     * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.
     * ServletContextEvent)
     */
    @Override
    public void contextDestroyed(ServletContextEvent sContext) {

    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * javax.servlet.ServletContextListener#contextInitialized(javax.servlet
     * .ServletContextEvent)
     */
    @Override
    public void contextInitialized(ServletContextEvent sContext) {
        try {
            ThreadContext.put("LISTENER", "TEST");
            logger.info("Inizializzazione variabili mdc completata");
        } catch (Exception e) {
            logger.error("Inizializzazione variabili mdc fallita", e);
        }

    }

}

这是我的 web.xml:

<listener>
        <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
    </listener>
    <listener>
        <listener-class>MdcServletListener</listener-class>
    </listener>
    <filter>
        <filter-name>log4jServletFilter</filter-name>
        <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>log4jServletFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>

有什么建议吗? 谢谢。

最佳答案

MDC 配置保存特定于客户端或特定于请求的数据,并且基本上是按线程/客户端完成的。换句话说,因为每个客户端对 servlet 的请求都由容器的单独线程处理;配置应该放在该 servlet 的过滤器中,而不是放在 ServletContextListener(您的 MdcServletListener 类)中。您扩展的 ServletContextListener 是针对每个 Web 应用程序的,并不保存 MDC 所需的单独请求数据。

建议放置此行 ThreadContext.put("LISTENER", "TEST"); 在您自己的 servlet 过滤器中。

然后在你的 log4j.properties 中;您可以使用以下方式访问您设置的上述变量:- %X{LISTENER}%n

例如,您的 log4j.properties 中的附加程序配置将更改如下:- log4j.appender.yourAppender.layout.ConversionPattern = %-4r [%t] %5p %c %x - %m - %X{LISTENER}%n

在上面的示例配置中,请注意最后添加的 %X{LISTENER}%n 以访问您设置的 MDC 特定数据。

关于web-applications - Log4j2:无法使用 Servlet 上下文监听器设置 MDC key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25721949/

相关文章:

java - 向 Web 应用程序添加电子邮件功能需要什么?

javascript - React/NodeJS - 当访问 localhost :3000 时网页无法工作

spring-boot - 带有嵌入式 Tomcat 的 Spring Boot 中的 Log4J2

java - Log4j2 SyslogAppender 不工作

java - Logback sfl4j MDC对http请求是唯一的

javascript - 在 Javascript Web 应用程序中与新的 Facebook 像素进行高级匹配

javascript - 推特 Bootstrap : Is it possible to center container-fluid with two rows with span5 or span4?

java - 强制 maven spring boot 项目使用旧版本的依赖项,而不是另一个依赖项的新版本

java - 带有 ThreadPools 或 Spring Async 的 Logback MDC

webpack - 设置 webpack 4.0 以通过 ExtractTextPlugin 使用 Google Material 设计 SASS