轻量级的日志跟踪工具-MDC

MDC(Mapped Diagnostic Context)是log4j和logback提供的多线程日志跟踪工具,用于在复杂的请求调用链路中区分不同用户的日志。本文介绍了MDC的工作原理,讨论了错误的通过线程名区分请求的方案,提出了通过生成全局唯一标识符(trace_id)并利用MDC在请求全程记录的方法,确保日志的正确对应。
摘要由CSDN通过智能技术生成

一、什么是MDC?

MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能,也可以说是一种轻量级的日志跟踪工具。

二、MDC能为我们做什么?

当我们在开发过程中遇到问题时,我们大多数情况下都会借助查询日志寻找问题,那么如何在海量的日志中查询到我们某个请求的一系列调用信息便显得尤为重要,那么MDC就能为我们解决这一问题。

三、MDC衍生的具体场景

在开发过程中,大多数情况下我们的一个请求调用链路可能相当复杂,并且在链路的调用过程中,我们会对一些关键的操作做日志埋点,例如入参、出参,以及一些复杂的计算结果打印。
往往线上用户量都是比较大的,例如用户1可能会调用到某个请求链路,用户2同时也调用到了同样的请求链路,每个用户在调用到这个链路的时候都会打印出当前链路的所有日志。那么,我们怎么知道哪些日志是用户1调用时打印的,哪些日志是用户2调用时打印的?所以我们就是为了寻找一种方案能够解决如上问题。

三、解决方案

错误的方案

有些人提出了一种解决方案,他们认为,http的一次请求会使用一个线程,那么通过线程名就可以区分是不是同一个请求了。这种方案是不可行的,因为我们知道web服务器是不可能一直创建线程的,而且他的内部有线程池,用于线程的统一管理。线程池内的线程存在重复利用的情况,所以在用户量较大时,很可能存在短时间内多个请求使用同一个线程的可能,那么我们就无法区分哪些日志是通一个请求的了。如下图所示,两个不同的时间段,使用了相同的线程。
在这里插入图片描述
在这里插入图片描述

正确的方案

我们可以在每一次请求进来的时候,创建一个全局唯一的标识符,该标识符无任何

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值