MDC 输出线程信息帮助定位问题

本文详细解析了Log4j中NDC与MDC的工作原理及使用方法,包括它们如何利用ThreadLocal来存储上下文信息,并介绍了如何在多线程环境下正确地使用这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

log4j中的%x ---NDC,%X---MDC

即%x 

NDC.clear();
NDC.push(this.toString());
%X{first} %X{last}
MDC.put("first", "Dorothy"); Logger logger = LoggerFactory.getLogger(SimpleMDC.class); // We now put the last name MDC.put("last", "Parker");

mdc 实际上是一个封装了ThreadLocal变量的一个类。

官方实现:mdc 包含了一个ThreadLocalMap   因为  ThreadLocalMap extends InheritableThreadLocal  所以他有特性1:可以向下传递,2.本身处理的是hashTable 。

  final static MDC mdc = new MDC();
  
  static final int HT_SIZE = 7;

  boolean java1;
  
  Object tlm;

  private Method removeMethod;

  private
  MDC() {
    java1 = Loader.isJava1();
    if(!java1) {
      tlm = new ThreadLocalMap();
    }

    try {
      removeMethod = ThreadLocal.class.getMethod("remove", null);
    } catch (NoSuchMethodException e) {
      // don't do anything - java prior 1.5
    }
  }

NDC

一层一层深入 发现也是包含了一个 ThreadLocal,由于它不具有InheritableThreadLocal 的特性,所以开启新线程的时候,需要手动重新设置。

public static void push(String message) {
        ThreadContext.push(message);
    }
    public void push(String message) {
        if (this.useStack) {
            this.add(message);
        }
    }
    public boolean add(String s) {
        if (!this.useStack) {
            return false;
        } else {
            MutableThreadContextStack copy = this.getNonNullStackCopy();
            copy.add(s);
            copy.freeze();
            stack.set(copy);
            return true;
        }
    }
public class DefaultThreadContextStack implements ThreadContextStack {
    private static final long serialVersionUID = 5050501L;
    private static final ThreadLocal<MutableThreadContextStack> stack = new ThreadLocal();
    private final boolean useStack;

开启线程时操作

        final String s=NDC.get();
        final Map<String, String> mdcdata = MDCUtil.peekMap();
        ThreadPoolUtil.ex.execute(new Runnable() {
            @Override
            public void run() {
                MDCUtil.set(mdcdata);
                NDC.push(s);
                alarmInfoSao.sendAlarmEventMsg(alarmEventDTO);
            }
        });

 

转载于:https://www.cnblogs.com/z-test/p/9474753.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值