【发布时间】:2019-06-06 12:42:15
【问题描述】:
我有一个多线程应用程序,其中每个线程操作具有名称的不同对象,即:
process-1
process-2
process-3
目前的模式是这样的:
[%thread] - %msg %n
我想实现这样的目标:
[%thread] %processName - %msg %n
其中processName 在对象中指定。
我的目标是将这些名称添加到生成的日志中,这样当我需要查看历史记录时,我就可以非常轻松地对它们进行 grep。我已经记录了线程名称,但这对我来说还不够。
我已经开始使用 MDC,但事实证明它在所有线程之间保留了存储的名称。在最好的情况下,它为所有日志使用该名称,在最坏的情况下,该属性为空。
如何在有或没有 MDC 的情况下实现这种线程安全的日志记录?
【问题讨论】:
-
MDC 值是线程本地的,我不知道你的意思是 它在所有线程之间保留存储的名称。在 Logback 1.1.5 之前,子线程会自动继承 MDC 上下文。在 1.1.5 之后,MDC 上下文不再自动继承。
-
将
processName登录到msg还不够吗? -
我认为您正在使用线程池,并且您没有在处理结束时清除 MDC 值,从而导致为两个不同的任务打印相同的 MDC 值。请注意,MDC 值存储在
ThreadLocal变量中。现在,由于在任务结束时,线程返回到池以供不同任务使用,因此 MDC 值保持不变。 -
@nandsito 表示将 processid 作为参数发送给每个方法
-
@SaptarshiBasu 完全正确。所以我必须在线程返回池之前清理 ThreadLocal?