系统之家提供 Windows 系统、Ghost 系统、驱动与常用软件的安全下载及安装教程。 后台管理
📢 欢迎访问系统之家!所有资源均经过安全检测。

Spring Boot

发布时间:2026-10-06 | 浏览:2
📥 下载地址(文章开头)
装机神器,可安装一切系统,纯净版,英文版,繁体版 ,精简版,原版等等等
Spring Boot - 利用MDC(Mapped Diagnostic Context)实现轻量级同步/异步日志追踪 每日一博 - ThreadLocal VS InheritableThreadLocal VS TransmittableThreadLocal 什么是MDC(Mapped Diagnostic Context) MDC(Mapped Diagnostic Context)是一个在日志框架中常用的概念,主要用于在多线程环境中关联和传递一些上下文信息,以便在日志输出中包含这些信息,从而实现更好的日志记录和调试。 在Java中,常见的日志框架如Log4j、Logback和Log4j2都提供了对MDC的支持。 线程绑定的上下文信息: MDC允许在多线程环境中将上下文信息与线程相关联。可以在应用程序的不同部分设置一些上下文信息,并确保在同一线程中的后续日志记录中能够访问到这些信息。 适用于跟踪请求或会话: MDC特别适用于跟踪请求或会话相关的信息,如请求ID、会话ID等。通过在请求开始时设置这些信息,并在请求结束时清理它们,可以确保在整个请求处理过程中,日志都包含了相同的上下文信息,方便排查问题。 日志格式化支持: MDC的值可以通过特殊的占位符在日志输出格式中引用。这样,在日志输出时,可以直接将MDC中的值包含在日志中,从而让日志更具可读性和可跟踪性。 避免参数传递的复杂性: 使用MDC可以避免在方法调用链中手动传递上下文信息的复杂性。相反,可以在适当的地方将信息设置到MDC中,在日志输出时框架会自动将这些信息包含在日志中。 简而言之,MDC是一个非常有用的工具,可以帮助开发人员在日志中记录和跟踪关键的上下文信息,提高了调试和排查问题的效率。 **SLF4J(Simple Logging Facade for Java)**是一个日志门面框架,它提供了一种简单的方式来访问各种日志系统,例如Log4j、Logback、java.util.logging等。SLF4J本身并不是一个日志实现,而是提供了统一的接口,开发人员可以通过它来编写日志代码,而不用关心底层日志系统的具体实现。 **MDC(Mapped Diagnostic Context)**是SLF4J的一个功能,用于在日志输出中关联和传递上下文信息。MDC允许开发人员在代码中设置一些上下文信息,例如请求ID、用户ID等,然后在日志输出时将这些信息包含在日志中,以便于跟踪和调试。 SLF4J和MDC之间的关系可以总结如下: SLF4J提供了MDC的接口: SLF4J允许开发人员通过其API来使用MDC功能。它提供了一些方法,例如 MDC.put(key, value) 用于设置上下文信息, MDC.get(key) 用于获取上下文信息等。 MDC依赖于底层的日志实现: 虽然MDC是SLF4J提供的功能,但其实现是依赖于底层的日志实现的。不同的日志实现,如Logback、Log4j等,都有自己的MDC实现。因此,开发人员需要确保在使用MDC时,底层的日志实现已经正确配置。 MDC提供了与SLF4J日志框架的集成: MDC的设计目的之一是与SLF4J的日志框架集成得很好。这意味着开发人员可以在使用SLF4J编写的日志代码中,轻松地使用MDC功能,从而在日志中记录和跟踪上下文信息。 SLF4J和MDC是紧密相关的,MDC是SLF4J的一个功能,用于在日志输出中传递上下文信息,而SLF4J提供了使用MDC功能的接口。这使得在使用SLF4J编写的日志代码中,可以方便地利用MDC来增强日志的可读性和可追踪性。 logback-spring.xml 使用SLF4J门面是一个很好的实践,特别是在与logback等日志实现框架集成时。SLF4J提供了一个统一的接口,使得应用代码与具体的日志实现解耦,从而可以轻松地切换和替换底层的日志实现,而无需修改应用代码。 通过使用SLF4J门面,可以在应用程序中使用SLF4J的API编写日志代码,例如Logger接口中的方法,而不用关心底层的日志实现是logback、Log4j还是其他日志框架。这使得代码更具灵活性和可维护性,可以根据需要随时替换底层的日志实现,而不会影响应用程序的其他部分。 对于大多数Java项目来说,使用SLF4J门面和logback作为底层的日志实现是一个非常常见的选择。这样做不仅提供了对日志功能的灵活控制,还能够保持与标准的Java日志习惯的兼容性。同时,SLF4J和logback之间的集成也非常完善,可以充分发挥它们之间的协作优势。 这里我们使用 logback ,其他日志组件均可无缝替换。 application.yml 在请求处理前后设置和清理MDC中的追踪ID的请求追踪日志拦截器。 在 preHandle 方法中,它从请求头中获取追踪ID,如果不存在则使用默认的ULID生成器生成一个新的追踪ID,并将其放入MDC中。 在 afterCompletion 方法中,它简单地移除MDC中的追踪ID,以确保不影响后续请求的日志记录。
📥 下载地址(文章中间)
装机神器,可安装一切系统,纯净版,英文版,繁体版 ,精简版,原版等等等
这个配置类是 WebMvcConfigurer 接口的实现类,用于配置拦截器。它注册了 TraceLogInterceptor 拦截器,并将其添加到拦截器链中。 可以通过 addInterceptors 方法来指定哪些请求需要被拦截,哪些请求不需要被拦截。通过这种方式,可以灵活地控制拦截器的应用范围,以满足不同的业务需求. 启动应用,访问:http://127.0.0.1:9999/testTrace?name=artisan 日常开发中,异步处理必不可少,我们来看看如何实现一个轻量的异步日志追踪吧 。 思路: 将父线程的trackId传递下去给子线程 用于配置异步任务执行器,声明了一个名为"ArtisanExecutor"的Bean,返回一个自定义的ArtisanThreadPoolTaskExecutor执行器实例。在这个执行器中,配置了线程池的各种参数,如核心线程数、最大线程数、队列容量等。这样就创建了一个具有自定义配置的线程池执行器,用于执行异步任务。 继承自 Spring 的 ThreadPoolTaskExecutor ,在执行任务时使用了 ThreadMdcUtil 工具类来传递父线程的MDC上下文信息到子线程中。通过这种方式,可以确保异步任务在执行过程中能够访问到父线程的MDC上下文信息,从而实现了日志的跟踪。 在多线程环境中传递MDC上下文信息。提供了两个静态方法wrap,用于在父线程向线程池中提交任务时,将父线程的MDC上下文信息复制给子线程。这样可以确保在异步任务中也能够访问到父线程设置的MDC上下文信息,实现了日志的跟踪。 http://127.0.0.1:9999/testTrace?name=artisan http://127.0.0.1:9999/testTrace2?name=artisan222 通过合理地利用MDC、拦截器、自定义线程池和工具类等技术手段,可以很好地实现 Spring Boot 应用的日志链路追踪,从而更方便地定位和排查问题,提升应用的可维护性和可靠性 什么是MDC(Mapped Diagnostic Context) 基础工程 工程结构 POM logback-spring.xml application.yml 同步方式 方式一: 拦截器 方式二: 自定义注解 + AOP 测试 异步支持 线程池配置类 自定义线程池任务执行器 线程MDC工具类 模拟业务类@Async 测试 logback-spring.xml application.yml 同步方式 方式一: 拦截器 方式二: 自定义注解 + AOP 测试 方式二: 自定义注解 + AOP 异步支持 线程池配置类 自定义线程池任务执行器 线程MDC工具类 模拟业务类@Async 测试 社区 技术文章 技术问答 技术沙龙 技术视频 学习中心 技术百科 技术专区 活动 自媒体同步曝光计划 邀请作者入驻 自荐上首页 技术竞赛 圈层 腾讯云最具价值专家 腾讯云架构师技术同盟 腾讯云创作之星 腾讯云TDP 关于 社区规范 免责声明 联系我们 友情链接 MCP广场开源版权声明 Copyright © 2013 - 2026 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 粤公网安备44030502008569号 腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号
📥 下载地址(文章结尾)
装机神器,可安装一切系统,纯净版,英文版,繁体版 ,精简版,原版等等等