跨越多个线程的任务的日志关联

时间:2012-06-11 20:36:07

标签: java logging log4j

我的软件中的任务涉及几个步骤,其中每个步骤可能会或可能不会在不同的线程中执行。每个步骤都有一些日志,我使用log4j作为日志记录服务。

头痛问题是很难将不同线程打印的日志与它们所属的任务相关联。在单线程模式下,线程名称是一个很好的指示器,但它不能在多线程模式下工作。我不想通过线程传递任务指示器,因为它很烦人并且会给程序员带来负担。

我想知道是否有人面临同样的问题并且有一个很好的解决方案?谢谢。

2 个答案:

答案 0 :(得分:1)

在MDC(映射诊断上下文)和NDC(嵌套诊断上下文)上查找log4j's documentation。以下是this article

的摘录
  

嵌套诊断上下文(NDC)和映射诊断上下文(MDC)   帮助同时涉及一个应用程序的情况   为多个客户提供服务,您有兴趣分离或   distingushing来自这些多个客户端的日志内容。网络   应用程序是这种情况的一个很好的例子。

     

那么我们如何将内容与多个客户分开或区分?通过   使用特定于客户端的信息标记每个日志语句。这个,在   典型的Web应用程序,除其他外,还可以包括   客户端的IP地址,可供servlet随时使用   容器。因此,在NDC中,您可以在堆栈中将此信息推送到堆栈   输入上下文,并在离开该上下文时弹出它。 log4j使用   写入appender时的特定于上下文的信息,如果在   您的关联布局,您使用%x转换模式。

答案 1 :(得分:0)

为此目的创建了两个类org.apache.log4j.MDC和org.apache.log4j.NDC。 只需引用Javadocs:NDCMDC