一、什么是MDC?
MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能,也可以说是一种轻量级的日志跟踪工具。
二、MDC能为我们做什么?
当我们在开发过程中遇到问题时,我们大多数情况下都会借助查询日志寻找问题,那么如何在海量的日志中查询到我们某个请求的一系列调用信息便显得尤为重要,那么MDC就能为我们解决这一问题。
三、MDC衍生的具体场景
在开发过程中,大多数情况下我们的一个请求调用链路可能相当复杂,并且在链路的调用过程中,我们会对一些关键的操作做日志埋点,例如入参、出参,以及一些复杂的计算结果打印。
往往线上用户量都是比较大的,例如用户1可能会调用到某个请求链路,用户2同时也调用到了同样的请求链路,每个用户在调用到这个链路的时候都会打印出当前链路的所有日志。那么,我们怎么知道哪些日志是用户1调用时打印的,哪些日志是用户2调用时打印的?所以我们就是为了寻找一种方案能够解决如上问题。
三、解决方案
错误的方案
有些人提出了一种解决方案,他们认为,http的一次请求会使用一个线程,那么通过线程名就可以区分是不是同一个请求了。这种方案是不可行的,因为我们知道web服务器是不可能一直创建线程的,而且他的内部有线程池,用于线程的统一管理。线程池内的线程存在重复利用的情况,所以在用户量较大时,很可能存在短时间内多个请求使用同一个线程的可能,那么我们就无法区分哪些日志是通一个请求的了。如下图所示,两个不同的时间段,使用了相同的线程。
正确的方案
我们可以在每一次请求进来的时候,创建一个全局唯一的标识符,该标识符无任何