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

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

1. NDC 快速入门;

2. NDC 与 MDC 有何不同;

3. NDC 刨根问底

1. NDC 快速入门

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

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

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

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

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

程序跑起来看看效果。

知道MDC,那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 背后是什么?

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

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

4. 写在最后

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

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

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

推荐阅读:

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

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

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

相关文章:

  • 2022-12-23
  • 2021-07-28
  • 2021-10-01
  • 2019-11-29
  • 2021-08-17
  • 2021-10-16
  • 2021-06-01
猜你喜欢
  • 2021-08-07
  • 2021-11-27
  • 2018-06-07
  • 2018-01-21
相关资源
相似解决方案