在项目开发中,经常会巧妙借助 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 如何实现优雅停服?刨根问底

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

  1. 画直线_在鸡面前画一条直线,为什么它会晕?西瓜视频这知识好冷告诉答案

    为什么世界有那么多的未解之谜,我们无从而知,今天我们来探讨一下在鸡面前画条直线为什么会晕?你们知道吗?今天西瓜视频这知识好冷告诉你们答案,帮助你们掌握生活中所不知道的涨知识,增加我们的知识库. 优秀创 ...

  2. python冷知识_python冷知识

    省略号也是对象 在python中一切皆对象,省略号(...)也是一个对象注意:只能是三个点的省略号 在python中叫做Ellipsis 在python3中能直接得到它 print(...) prin ...

  3. php冷门知识,科普冷知识:6个很有意思的冷知识,不求有用,但求有趣

    冷知识分享,不求有用,但求有趣. 01 憋着的屁不放的时候,屁会被肠壁吸收收进入血液,于是肠道里的气压消失了, 然而屁并没有消失,它只是随着血液进入全身循环,之后到了肝脏,会被肝脏过滤,再到达肺部, ...

  4. log4j的NDC/MDC区别与应用

    MDC与NDC除了存储方式(MDC采用MapNDC采用堆栈结构)有区别,其他都一样的 关键点 A -//引入log4j MDC类org.apache.log4j.MDC -//设置值 -MDC.put ...

  5. 百度地图手机和电脑不一致_你可能不知道的电脑手机冷知识

    各位好久不见呀,自科部科科又回来了!平时我们经常使用电脑,你可能以为你对电脑和手机了如指掌,然而下面的冷知识你知道多少个? 01 一台电脑可以有多个桌面 如果你熟练的使用多个桌面这个技巧那么就可以躲着 ...

  6. 电站锅炉行业PLM的可定制知识管理软件

    定制是一个知识驱动过程,因此知识和信息是成功实现大规模定制的关键.针对电站锅炉行业的知识管理现状,结合可定制的清软英泰PLM系统平台,定制的研发了面向行业的知识管理构件,高效管理和利用电站锅炉行业的知 ...

  7. 分享几个有趣实用的冷知识,涨知识了

    苏生不惑第377 篇原创文章,将本公众号设为星标,第一时间看最新文章. 今天分享几个让你涨知识的冷知识. 身份证号码的X 之前详细介绍过身份证号码的由来身份证号码的秘密  ,号码最后一位Ⅹ表示罗马数字 ...

  8. 苹果手机量体温_用手机可以量体温?反派不能用 iPhone?奇怪的知识又增加了.........

    哈喽狗子们好 有的人在家闲了一个多月 体重增加了不少 而冷哥就不一样了 我是正儿八经的东西没学会 奇怪的知识倒是增加了不少 比如我的朋友告诉我 除了体温计可以量体温之外 用手机也可以给自己测体温! 哇 ...

  9. 图文详解mina框架

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务.虚拟机管道通信服务等),M ...

  10. ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例

    前言 最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录. 首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开 ...

最新文章

  1. np.random.seed用法
  2. Vue-router 报NavigationDuplicated的可能解决方案
  3. 通常,Node.js如何处理10,000个并发请求?
  4. centos出现磁盘坏道,怎么检索和修复
  5. Java Web编程的主要组件技术——Hibernate入门
  6. python画旋转圆_Python使用PyQt界面库绘制不停旋转的圆控件
  7. 微软发布Visual Studio 2010 SP1公测版
  8. Swift3.0语法1
  9. C语言字符型数据scanf,scanf()函数如何输入字符型数据?
  10. btrfs文件系统学习总结
  11. 在企业级管理软件领域,国内尚没有“好”产品
  12. linux服务器校对时间方法
  13. 如何在官网上下载MySQL驱动--最新方法
  14. 如何提高服务器并发能力
  15. 破解程序员的 5 大迷思,《新程序员 004》正式上市!
  16. 在IDEA中集成Jenkins插件 解决Missing or bad crumb data异常
  17. php程序打包exe文件下载,手把手教你把前端代码打包成msi和exe文件
  18. 【SSL】2022.5.2 1125.集合
  19. 利用imu估计roll、pitch的理解
  20. mysql启动数据库进程_MySQL数据库启动报错的处理

热门文章

  1. 面对人工智能最大威胁,马斯克们太天真了。道翰天琼认知智能机器人平台API大脑。
  2. 【LTE】LTE 基础之RB和RE、REG、CCE的定义
  3. 程序错误:Cannot construct instance of `java.time.LocalDate` LocalDateTime序列化问题:
  4. 依附在Activity上的Fragment生命周期与Activity生命周期回调顺序
  5. 【JAVA】图书管理系统(简单初阶版)
  6. [架构师之路] 高可扩展表结构系列
  7. 最后期限——BOSS工程项目的管理(转)
  8. 命令行升级 Cisco ios AP c3702i c3602i c2702i 1702i胖固件 Autonomous ios image ap3g2-k9w7-tar.153-3.JPO.tar
  9. CocosCreator官方教学视频(腾讯超清版)[20180428更新]
  10. APP上架遇到的常见被拒原因