Log4j配置会话变量

时间:2018-02-03 03:12:24

标签: log4j

需要log4j配置会话变量。

假设我有3个变量 - 会话ID,用户名,用户ID,公司ID

我希望所有这些变量都打印在日志和记录器严重性的日志中。

如何配置它以打印所有上述值?

感谢。

1 个答案:

答案 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。