知道MDC,那NDC是什么?这个知识有点冷

在项目开发中,经常会巧妙借助 MDC 解决链路跟踪、统计耗时等很多问题,通过往期分享的《MDC是什么鬼?用法、源码一锅端》,对 MDC 有了一个深入的了解,但是细心的同学在项目中,偶尔会发现 NDC 的身影(可能也从未谋面),那 NDC 到底是个什么玩意呢?

别急,通过今天的分享,能让你轻松 get 如下几点。

1. NDC 快速入门;

2. NDC 与 MDC 有何不同;

3. NDC 刨根问底

1. NDC 快速入门

NDC 的全称是 Nested Diagnostic Context,直译过来是:嵌套诊断上下文。文字略显枯涩,能用代码解释的,一言不合就抛代码。

上面这个代码来源于 MDC 分享,只是把类名换成了 SimpleNDC,然后把 MDC 相关的 API 换成了 NDC。

引入 slf4j-ext 依赖包,然后修改 logback.xml,采用 %X 取 NDC 中的值。

程序跑起来看看效果。

通过输出,能够得出如下结论。

a)NDC 提供的 push 方法,可以将一个值放进容器中,理解成入栈操作,当然可以多放几个(自己试一试);

d)通过 %X 获取 NDC 中所有的值;

b)NDC 中的值是线程隔离的,互不影响;

c)NDC 提供的 pop 方法,可以将一个值从容器中拿出来,理解成出栈操作。

根据结论的第二条,就能想到使用场景,当要把请求信息全部打印到日志文件中时,借助这种方式就轻而易举实现。

2. NDC 与 MDC 有何不同?

a)MDC vs NDC ?

MDC 提供的 put 方法,可以将一个 K-V 的键值对放到容器中,并且能保证同一个线程内,Key 是唯一的,不同的线程 MDC 的值互不影响;

NDC 提供的 push 方法,可以将一个值放进容器中,理解成入栈操作,当然可以多放几个;NDC 中的值是线程隔离的,互不影响。

b)  MDC vs NDC ?

在 logback.xml 中,在 layout 中可以通过声明 %X{key} 来输出 MDC 中 key 的信息;

在 logback.xml 中,在 layout 中可以通过声明 %X 获取 NDC 中所有的值;

c)MDC vs NDC?

MDC 提供的 remove 方法,可以清除 MDC 中指定 key 对应的键值对信息。

NDC 提供的 pop 方法,可以将一个值从容器中拿出来,理解成出栈操作。

3. NDC 刨根问底

好奇是程序猿(媛)的通病,还是好奇的要看看 NDC 背后是什么?

见到源码,感觉累崩。org.slf4j.NDC 底层居然借助 MDC 来实现的入栈、出栈。再结合 MDC 仔细去想,其实就是借助 Map 实现的数据存储,只不过 NDC 把 key 给屏蔽啦,自己在内部给封装啦,没有对外暴露,见此应该豁然开朗了不少吧。

4. 写在最后

一次冷知识的分享,知其然知其所以然,希望有所收获。

一起聊技术、谈业务、喷架构,少走弯路,不踩大坑。会持续输出原创精彩分享,敬请期待!

推荐阅读:

项目中这样统计方法耗时不香吗?

程序员的道与术(小视频)

Java 如何实现优雅停服?刨根问底

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值