Log4j2:无法使用Servlet Context Listener设置MDC密钥

时间:2014-09-08 10:15:11

标签: web-applications log4j2 mdc

我尝试使用Servlet Context Listener将主机名设置为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>

有什么建议吗? 感谢。

1 个答案:

答案 0 :(得分:2)

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

建议放这条线 您自己的servlet过滤器中的ThreadContext.put("LISTENER", "TEST");

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

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

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