【问题标题】:Logback and MDC in multithreaded system多线程系统中的 Logback 和 MDC
【发布时间】: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?

标签: java logging logback mdc


【解决方案1】:

我假设每个进程在不同的线程中运行 因此,当启动一个线程放入 MDC 时,id 进程

// this method runs in different thread for each invocation.
public void startProcess(String idProcess) {
    MDC.put("processName", idProcess);
     ....

并在您的 logback 中更改模式

[%thread] %X{processName} %msg %n

put方法将id保存在线程中,因此每个线程会有不同的值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    相关资源
    最近更新 更多