在项目开发中,经常会巧妙借助 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.写在最后
一次冷知识的分享,知其然知其所以然,希望有所收获。
一起聊技术、谈业务、喷架构,少走弯路,不踩大坑。会持续输出原创精彩分享,敬请期待!
推荐阅读:
最新评论