1

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

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

我想知道有人遇到过同样的问题并有好的解决方案吗?谢谢你。

4

2 回答 2

1

查找log4j关于 MDC(映射诊断上下文)和 NDC(嵌套诊断上下文)的文档。以下是这篇文章的节选

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

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

于 2012-06-11T20:46:19.297 回答
0

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

于 2012-06-11T20:54:33.580 回答