slf4j的MDC机制

MDC(Mapped Diagnostic Context)诊断上下文映射,是slf4j提供的一个支持动态打印日志信息的工具,举例来说,对于一个web Server,如果服务端想在打印出的每行日志中都记录客户端的ip,你只需要在服务端入口获取到cleint ip,设置到MDC中,服务请求结束时,移除掉。如果日志配置文件配置得当,这一过程中所有打印的日志信息中都会显示clientIp。

slf4j介绍MDC
logback中的MDC

使用方式

logback中的MDC一文即可,比较简单。

在大型分布式系统中,MDC的用途是很大的。阿里巴巴的大量业务系统服务端记录日志都使用到了这一技术,所有业务请求在中间件(鹰眼)的作用下,都会带上一个traceId,业务系统中打印日志时需要将该traceId记录下来,分析问题、联调都会带来很大便利。

一个需要注意的点就是,MDC是线程安全、隔离的,如果服务端处理请求的线程需要生产更多的子线程时(Executors.execute), MDC中的信息会丢失,开发者需要自己主动拷贝 MDC信息到子线程中去,相关的api有
MDC.getCopyOfContextMap(), MDC.setContextMapValues()

原理

涉及到SPI原理, Adapter适配器设计模式,ThreadLocal线程副本变量等方面。

slf4j-api的MDC工具类可以put(key,val),看代码可以发现,是通过SLF4JServiceProvider找到了绑定的底层日志框架,获取到了底层真正的MDCAdapter, put方法也是底层的MDCAdapter在执行。

MDC目前只有log4j和logback有实现,logback的实现类LogbackMDCAdapter利用的ThreadLocal技术保证了每个请求线程保有自己的MDC环境变量。

其实,不难猜,当打印日志时,肯定会根据配置文件中MDC的配置符 去MDC中获取到相应的MDC值,替代日志格式中的占位符,这里不详细展开,只附加一张图。
在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值