国产毛多水多高潮高清,久热这里只有精品视频6,国内精品久久久久久久久电影网,国产男同志CHINA69,精品999日本久久久影院,人人妻人人澡人人爽人人精品,亚洲中文无码永久免

基于Slf4j的MDC实现日志链路串联-华夏彩票官网下载4595

基于Slf4j的MDC实现日志链路串联

2026-01-17 16:48:48投稿人:99822皇冠手機(jī)版(廈門(mén))有限公司圍觀4294663 評(píng)論

基于Slf4j的MDC實(shí)現(xiàn)日志鏈路串聯(lián)

一、問(wèn)題背景

為了方便運(yùn)維日常定位排查問(wèn)題時(shí),使用traceId查詢(xún)?nèi)罩緯r(shí)可以完整的查看當(dāng)前業(yè)務(wù)請(qǐng)求的完整日志鏈路,需使用traceId(日志跟蹤號(hào))將日志串聯(lián)起來(lái) 。

系統(tǒng)采用LogBack日志組件,在輸出日志時(shí)輸出_traceId日志跟蹤號(hào),logback.xml配置如下 :

../log/${ ServerName}/${ AppName}.log../log/${ ServerName}/${ AppName}.log.%d{ yyyy-MM-dd}        7%d{ HH:mm:ss.SSS} %-5level [%.15thread][%X{ _traceId}] %logger{ 36} - %.-4096msg%n

公司系統(tǒng)采用分布式架構(gòu),從接收到請(qǐng)求到業(yè)務(wù)處理完成并返回,涉及SpringMVC入口 、服務(wù)間dubbo調(diào)用 、基于RocketMQ實(shí)現(xiàn)的業(yè)務(wù)解耦 、以及來(lái)自第三方渠道的http通知回調(diào)。

現(xiàn)在的問(wèn)題是從業(yè)務(wù)請(qǐng)求入口到返回業(yè)務(wù)響應(yīng),如何使用同一traceId將日志做串聯(lián) ?

Slf4j的MDC機(jī)制提供了上述問(wèn)題的解決方案。

二、解決方案

在介紹具體解決方案之前 ,首先介紹下Slf4j日志框架的MDC機(jī)制 。映射診斷上下文(Mapped Diagnostic Context  ,簡(jiǎn)稱(chēng)MDC)可以簡(jiǎn)單理解為當(dāng)前日志線程的上下文 ,也是一個(gè)k-v格式的map結(jié)構(gòu) 。

當(dāng)服務(wù)器幾乎同時(shí)處理多個(gè)請(qǐng)求時(shí),日志輸出通常是交錯(cuò)的 ,而MDC是基于每個(gè)線程進(jìn)行管理的  ,子線程自動(dòng)繼承其父線程的MDC的副本 ??梢酝ㄟ^(guò)往MDC里塞入traceId,達(dá)到串聯(lián)日志的目的  。

以下為MDC填充獲取traceId方法:

public final static String TRACE_ID = "_traceId";static private String generateTraceId() {     return UUID.randomUUID().toString().replaceAll("-", "");}public static String getTraceId() {     return MDC.get(TRACE_ID);}public static void setTraceId(String traceId) {     MDC.put(TRACE_ID, traceId);}public static void clearTrace() {     MDC.remove(TRACE_ID);}public static void initTrace() {     String traceId = generateTraceId();    setTraceId(traceId);}

2.1、接收http請(qǐng)求時(shí)的日志鏈路串聯(lián)

解決思路  :可以從HttpServletRequest獲取traceId并塞到MDC中。

具體如下