关于日志框架中 MDC(Mapped Diagnostic Context) 的核心介绍与使用教程,结合其在分布式系统中的实际应用场景,分模块说明:

一、MDC 简介

MDC(映射诊断上下文) 是 SLF4J/Logback 提供的一种线程级上下文存储机制,用于在多线程或分布式环境中为每个请求绑定唯一标识(如用户ID、请求ID),使日志能关联同一请求的全链路信息。其核心价值包括:

  • 区分请求来源:在并发场景下追踪特定客户端的日志流 。
  • 减少日志管理开销:避免为每个客户端创建独立 Logger 实例 。
  • 自动化上下文注入:通过配置,MDC 中的键值可自动输出到每条日志中 。

二、核心方法与使用

MDC 通过静态方法操作线程局部的 Map<String, String>,关键方法如下:

方法功能示例
put(key, value)绑定键值对到当前线程MDC.put("requestId", UUID.randomUUID());
get(key)获取当前线程的 MDC 值String id = MDC.get("requestId");
remove(key)移除指定键值MDC.remove("requestId");
clear()清空当前线程所有 MDC 数据MDC.clear();
getCopyOfContextMap()复制 MDC 映射(用于线程池传递)Map<String,String> copy = MDC.getCopyOfContextMap();
代码示例:基础操作
// 存储上下文
MDC.put("userId", "user123");
MDC.put("requestId", UUID.randomUUID().toString());// 日志自动携带 MDC 值(见第三节配置)
logger.info("Processing request...");// 清理防止内存泄漏
MDC.clear();

三、Spring Boot 集成实战

1. 添加依赖

确保包含 Logback 依赖(Spring Boot 默认集成):

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>

2. 配置 Logback 模式

logback.xml 中使用 %X{key} 注入 MDC 值:

<configuration><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss} [%thread] [%X{requestId}] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="INFO"><appender-ref ref="CONSOLE" /></root>
</configuration>

3. 拦截器自动管理 MDC

通过 HandlerInterceptor 在请求生命周期绑定/清理 MDC:

@Component
public class MdcInterceptor implements HandlerInterceptor {private static final String REQ_ID = "requestId";@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {MDC.put(REQ_ID, UUID.randomUUID().toString()); // 绑定请求IDreturn true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {MDC.remove(REQ_ID); // 请求结束移除}
}

注册拦截器:

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MdcInterceptor());}
}

4. 验证日志输出

日志将自动携带 requestId

12:45:22 [http-nio-8080-exec-1] [c6acd0ff-9c6a-4153-a12b] INFO com.example.Controller - Handling request from user123

️ 四、关键注意事项

  1. 线程池场景
    • 线程池中的线程会复用 MDC 上下文,需手动传递:
     // 父线程复制上下文Map<String,String> context = MDC.getCopyOfContextMap();executorService.submit(() -> {MDC.setContextMap(context); // 子线程绑定// ... 业务逻辑MDC.clear();});

2. 内存泄漏风险

  • 必须在请求结束时调用 remove() 或 clear(),否则 MDC 数据会随线程复用污染后续请求 。
  1. 内置过滤器
    • 使用 MDCInsertingServletFilter 自动注入请求基础信息(如 URL、IP):
     @Beanpublic FilterRegistrationBean<MDCInsertingServletFilter> mdcFilter() {FilterRegistrationBean<MDCInsertingServletFilter> bean = new FilterRegistrationBean<>();bean.setFilter(new MDCInsertingServletFilter());bean.addUrlPatterns("/*");return bean;}

五、适用场景总结

场景应用方式优势
分布式链路追踪微服务间传递 traceId全链路日志关联 

52

用户行为分析绑定 userId 到 MDC按用户过滤日志
性能监控记录请求耗时标记定位慢请求
异常排查异常日志携带请求参数快速复现问题 

58

通过 MDC,开发者能以低侵入方式实现日志的精细化治理,尤其在微服务架构中,它是提升可观测性的基础工具。完整代码示例可参考 Logback 官方文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92947.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92947.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/92947.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux随记(二十一)

一、highgo切换leader&#xff0c;follow - 随记 【待写】二、highgo的etcd未授权访问 - 随记 【待写】三、highgo的etcd未授权访问 - 随记 【待写】3.2、etcd的metric未授权访问 - 随记 【待写】四、安装Elasticsearch 7.17.29 和 Elasticsearch 未授权访问【原理扫描】…

Java环境配置之各类组件下载安装教程整理(jdk、idea、git、maven、mysql、redis)

Java环境配置之各类组件下载安装教程整理&#xff08;jdk、idea、git、maven、mysql、redis&#xff09;1.[安装配置jdk8]2.[安装配置idea]3.[安装配置git]4.[安装配置maven]5.[安装配置postman]6.[安装配置redis和可视化工具]7.[安装配置mysql和可视化工具]8.[安装配置docker]…

配置https ssl证书生成

1.可用openssl生成私钥和自签名证书 安装opensslsudo yum install openssl -y 2.生成ssl证书 365天期限sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \-keyout /etc/ssl/private/nginx-selfsigned.key \-out /etc/ssl/certs/nginx-selfsigned.crt3、按照提示编…

编程语言Java——核心技术篇(四)集合类详解

言不信者行不果&#xff0c;行不敏者言多滞. 目录 4. 集合类 4.1 集合类概述 4.1.1 集合框架遵循原则 4.1.2 集合框架体系 4.2 核心接口和实现类解析 4.2.1 Collection 接口体系 4.2.1.1 Collection 接口核心定义 4.2.1.2 List接口详解 4.2.1.3 Set 接口详解 4.2.1.4…

GaussDB 数据库架构师(八) 等待事件(1)-概述

1、等待事件概述 等待事件&#xff1a;指当数据库会话(session)因资源竞争或依赖无法继续执行时&#xff0c;进入"等待"状态&#xff0c;此时产生的性能事件即等待事件。 2、等待事件本质 性能瓶颈的信号灯&#xff0c;反映CPU,I/O、锁、网络等关键资源的阻塞情况。…

五分钟系列-文本搜索工具grep

目录 1️⃣核心功能​​ ​​2️⃣基本语法​​ 3️⃣​​常用选项 & 功能详解​​ ​​4️⃣经典应用场景 & 示例​​ 5️⃣​​重要的提示 & 技巧​​ ​​6️⃣总结​​ grep 是 Linux/Unix 系统中功能强大的​​文本搜索工具​​&#xff0c;其名称源自 …

Java面试题及详细答案120道之(041-060)

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

【尝试】本地部署openai-whisper,通过 http请求识别

安装whisper的教程&#xff0c;已在 https://blog.csdn.net/qq_23938507/article/details/149394418 和 https://blog.csdn.net/qq_23938507/article/details/149326290 中说明。 1、创建whisperDemo1.py from fastapi import FastAPI, UploadFile, File import whisper i…

Visual Studio 的常用快捷键

Visual Studio 作为主流的开发工具&#xff0c;提供了大量快捷键提升编码效率。以下按功能分类整理常用快捷键&#xff0c;涵盖基础操作、代码编辑、调试等场景&#xff08;以 Visual Studio 2022 为例&#xff0c;部分快捷键可在「工具 > 选项 > 环境 > 键盘」中自定…

Triton Server部署Embedding模型

在32核CPU、无GPU的服务器上&#xff0c;使用Python后端和ONNX后端部署嵌入模型&#xff0c;并实现并行调用和性能优化策略。方案一&#xff1a;使用Python后端部署Embedding模型 Python后端提供了极大的灵活性&#xff0c;可以直接在Triton中运行您熟悉的sentence-transformer…

Java动态调试技术原理

本文转载自 美团技术团队胡健的Java 动态调试技术原理及实践, 通过学习java agent方式进行动态调试了解目前很多大厂开源的一些基于此的调试工具。 简介 断点调试是我们最常使用的调试手段&#xff0c;它可以获取到方法执行过程中的变量信息&#xff0c;并可以观察到方法的执…

人工智能-python-OpenCV 图像基础认知与运用

文章目录OpenCV 图像基础认知与运用1. OpenCV 简介与安装OpenCV 的优势安装 OpenCV2. 图像的基本概念2.1. 图像的存储格式2.2. 图像的表示3. 图像的基本操作3.1. 创建图像窗口3.2. 读取与显示图像3.3. 保存图像3.4. 图像切片与区域提取3.5. 图像大小调整4. 图像绘制与注释4.1. …

Windows电脑添加、修改打印机的IP地址端口的方法

本文介绍在Windows电脑中&#xff0c;为打印机添加、修改IP地址&#xff0c;从而解决电脑能找到打印机、但是无法打印问题的方法。最近&#xff0c;办公室的打印机出现问题——虽然在电脑的打印机列表能找到这个打印机&#xff0c;但是选择打印时&#xff0c;就会显示文档被挂起…

告别复杂配置!Spring Boot优雅集成百度OCR的终极方案

1. 准备工作 1.1 注册百度AI开放平台 访问百度AI开放平台 注册账号并登录 进入控制台 → 文字识别 → 创建应用 记录下API Key和Secret Key 2. 项目配置 2.1 添加依赖 (pom.xml) <dependencies><!-- Spring Boot Web --><dependency><groupId>o…

「iOS」——内存五大分区

UI学习iOS-底层原理 24&#xff1a;内存五大区总览一、栈区&#xff08;Stack&#xff09;1.1 核心特性1.2 优缺点1.3函数栈与栈帧1.3 堆栈溢出风险二、堆区&#xff08;Heap&#xff09;;2.1 核心特性2.2 与栈区对比三、全局 / 静态区&#xff08;Global/Static&#xff09;3.…

每日一题【删除有序数组中的重复项 II】

删除有序数组中的重复项 II思路class Solution { public:int removeDuplicates(vector<int>& nums) {if(nums.size()<2){return nums.size();}int index 2;for (int i 2; i < nums.size();i ) {if(nums[i] ! nums[index-2]) {nums[index]nums[i];}}return ind…

兼容性问题记录

1、dialog设置高度MATCH_PARENT全屏后&#xff0c;三星机型和好像是一加&#xff0c;会带出顶部状态栏&#xff0c;设置隐藏状态栏属性无效。解决方法&#xff1a;高度不设置为MATCH_PARENT&#xff0c;通过windowmanager.getdefaultdisplay来获取并设置高度&#xff0c;再设置…

6.数组和字符串

在C语言中&#xff0c;数组和字符串是基础且重要的概念。它们用于存储和操作一系列相同类型的元素或字符序列。数组1. 数组定义与初始化数组是一系列相同类型的数据项的集合&#xff0c;这些数据项可以通过一个共同的名字来引用。数组中的每个元素都有一个索引&#xff08;也称…

odoo代码分析(一)

Odoo 是一套基于网络的开放式源代码商业应用套件,既可以作为独立应用运行,也可以作为集成的全功能 ERP 系统使用。Odoo 平台采用模块化架构,允许组织根据自身需求起步,并在需求增长时扩展功能。 什么是 Odoo? Odoo 提供了一个完整的商业应用生态系统,包括: 客户关系管…

从“人工眼”到‘智能眼’:EZ-Vision视觉系统如何重构生产线视觉检测精度?

制造业是我国实体经济的基础&#xff0c;是国内经济增长的重要引擎。制造业智能化建设是当下的必然趋势&#xff0c;然而目前依旧有很多中小型企业因为成本原因&#xff0c;无法加快智能化制造的步伐。在智能检测领域更是如此&#xff0c;很多企业依旧在采用人工检测&#xff0…