需要log4j配置会话变量。
假设我有3个变量 - 会话ID,用户名,用户ID,公司ID
我希望所有这些变量都打印在日志和记录器严重性的日志中。
如何配置它以打印所有上述值?
感谢。
答案 0 :(得分:0)
他们建议使用 MDC,这是 log4j 1.X 和 2 的一个特性。
MDC 类似于 Map,它使用 Java ThreadLocal 构造并提供静态 put() 和 get() 方法 - 因此它实际上是线程安全的,但应在使用后清除。
即据我了解 - 因为在 servlet 环境中线程是由某种线程池管理的,所以当处理 Web 服务器请求时,一些线程被分配给处理 - 当一个请求完成处理时,这个线程被释放并且可能被分配给下一个请求 - 因此在此之前清除 MDC 至关重要 - 或者至少在每个请求的处理开始期间重新分配其内容。
他们建议最好的模式是使用标准的 J2EE 请求过滤器。 例如。在 servlet 过滤器中:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
HttpServletRequest req = (HttpServletRequest) request;
HttpSession ses = req.getSession(false);
if (ses != null) {
String userId = (String)ses.getAttribute("userId");
if (userId != null) {
MDC.put("userId", userId);
}
}
chain.doFilter(request, response);
} finally {
MDC.remove("userId");
}
}
然后在 log4j.properties 配置文件中:
...
log4j.appender.file.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss,SSS} %-20X{userId} %5p %t %c{2} %m%n
...
我从 here 得到了这个信息,它也指向 here。我可以确认这适用于我在旧 OC4J 服务器上使用的 log4j 1.2。