一旦客户端登录到我的protal,我会在消息中附加用户ID,以便为用户打印所有日志消息。有什么办法可以将用户ID添加到一个公共位置吗?而不是排成一行。
这是我现在要做的......
LOGGER.info("client_id: "+client_id + " : Saving options..);
LOGGER.debug("client_id: "+client_id + " : return options are "+optionList);
答案 0 :(得分:2)
http://veerasundar.com/blog/2009/10/log4j-mdc-mapped-diagnostic-context-what-and-why/
如何区分每个客户的日志语句? 为了避免使用日志语句,我们可以在日志语句中添加一个用户名(或其他一些对每个客户端都是唯一的数据)。为此,我们必须确保将此用户名数据explicitley传递给每个日志语句,这是一项繁琐且重复的工作。但是,不用担心! Log4j有一个很好的方法可以解决这个问题。它被称为MDC或映射诊断上下文。
那么,什么是Log4j MDC(映射诊断上下文) 简而言之,MDC是一个映射,它存储运行上下文的特定线程的上下文数据。为了解释它,回到我们的简单应用程序 - 每个客户端请求将由MyServlet的不同线程提供。因此,如果使用log4j进行日志记录,那么每个线程都可以拥有自己的MDC,这对整个线程来说都是全局的。作为该线程一部分的任何代码都可以轻松访问线程MDC中存在的值。
那么,我们如何让MDC区分多个客户端的日志记录?简单:在您的代码中启动任何业务流程之前,获取用户名(对于我们的Servlet,我们可以从请求对象获取它)并将其放入MDC。现在,用户名将可用于进一步处理。在定义'conversionPattern'的log4j.properties中,添加模式%X {key}以检索MDC中存在的值。在我们的示例中,键将是“userName”。这就像从Session对象中获取值。