MDC(Mapped Diagnostic Context) 的核心介紹與使用教程

關于日志框架中 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…