我正在尝试使用 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/