温馨提示:这篇文章已超过453天没有更新,请注意相关的内容是否还可用!
Spring Boot利用MDC(Mapped Diagnostic Context)机制,通过为每个请求分配唯一的上下文ID,实现日志过滤。这种机制有助于快速定位单次请求相关的日志信息,提高问题排查效率。在应用程序运行过程中,MDC能够自动记录请求相关的上下文信息,并在日志输出时将其关联起来,方便开发者或运维人员通过简单的查询即可找到与特定请求相关的日志信息。这种日志管理方式提高了系统的可维护性和稳定性。
🏷️个人主页:牵着猫散步的鼠鼠
🏷️专栏系列:Java全栈专栏
🏷️个人学习笔记,如有疏漏,欢迎评论区指正
目录
1、引言:为什么需要MDC
在服务出现故障时,我们经常需要获取一次请求流程里的所有日志进行定位,如果请求只在一个线程里处理,我们可以通过线程ID来过滤日志,当请求包含异步线程的处理时,光靠线程ID就显得捉襟见肘了,本文将介绍如何通过MDC(Mapped Diagnostic Context)来快速过滤一次数据上报请求的所有业务日志。
2、MDC是什么
MDC是SLF4J的一部分,主要用于日志记录的实用工具,它提供了线程级别的日志上下文信息管理功能,SLF4J本身是一个抽象层,允许我们在使用不同的日志框架(如log4j, logback等)时,保持统一的日志API,MDC主要在logback和log4j中使用。
MDC允许我们在一个线程的执行上下文中设置和获取键值对,这些键值对在日志输出中可以以占位符的形式被引用,从而在日志信息中输出这些上下文信息,这在Web应用中跟踪用户请求或在分布式系统中跟踪跨服务的事务中特别有用。
3、代码实战
通过上面的介绍,你可能对MDC有了基本的了解,但理论总是需要结合实际来加深理解,我们将通过实战来演示MDC的使用。
我们在主函数中设置MDC的值,并在多个线程中打印日志,你会发现,在主线程中可以正确打印出MDC的值,但在异步线程中却打印不出来,这是因为MDC是基于ThreadLocal实现的,只能在当前线程中有效。
为了解决这个问题,我们可以使用装饰器模式来创建一个MDCRunnable类,对Runnable接口进行一层装饰,在创建MDCRunnable类时保存当前线程的MDC值,在执行run()方法时再将保存的MDC值拷贝到异步线程中去,这样,在异步线程中也可以正确打印出MDC的值了。
4、总结
本文讲述了如何使用MDC工具来快速过滤一次请求的所有日志,并通过装饰器模式使得MDC工具在异步线程里也能生效,利用MDC结合AOP技术,可以快速地收集相关日志信息,提高开发效率和运维维护的速度,希望本文能对您有所启发和帮助。
我在修改时添加了一些分段和标题,以使文章结构更清晰易读,我也对部分内容进行了润色和修正,以提高文章的可读性和准确性。
还没有评论,来说两句吧...