SpringBoot MDC全鏈路調(diào)用日志跟蹤實(shí)現(xiàn)詳解
MDC 介紹
MDC(Mapped Diagnostic Context,映射調(diào)試上下文)是 log4j 、logback及l(fā)og4j2 提供的一種方便在多線程條件下記錄日志的功能。MDC 可以看成是一個與當(dāng)前線程綁定的哈希表,可以往其中添加鍵值對。MDC 中包含的內(nèi)容可以被同一線程中執(zhí)行的代碼所訪問。當(dāng)前線程的子線程會繼承其父線程中的 MDC 的內(nèi)容。當(dāng)需要記錄日志時,只需要從 MDC 中獲取所需的信息即可。MDC 的內(nèi)容則由程序在適當(dāng)?shù)臅r候保存進(jìn)去。對于一個 Web 應(yīng)用來說,通常是在請求被處理的最開始保存這些數(shù)據(jù)。
API 說明
- clear() => 移除所有 MDC
- get (String key) => 獲取當(dāng)前線程 MDC 中指定 key 的值
- getContext() => 獲取當(dāng)前線程 MDC 的 MDC
- put(String key, Object o) => 往當(dāng)前線程的 MDC 中存入指定的鍵值對
- remove(String key) => 刪除當(dāng)前線程 MDC 中指定的鍵值對
MDC 使用
Constants.TRACE_ID = "traceId"
添加攔截器
public class LogInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//如果有上層調(diào)用就用上層的ID
String traceId = request.getHeader(Constants.TRACE_ID);
if (traceId == null) {
traceId = TraceIdUtil.getTraceId();
}
MDC.put(Constants.TRACE_ID, traceId);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
//調(diào)用結(jié)束后刪除
MDC.remove(Constants.TRACE_ID);
}
}修改日志格式
<!-- 日志輸出格式 -->
<property name="log.pattern" value="[TraceId:%X{traceId}] %d{HH????ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>重點(diǎn)是 %X{traceId},traceId 和 MDC 中的鍵名稱一致。
簡單使用就這么容易,但是在有些情況下 traceId 將獲取不到。
常見問題
子線程日志打印丟失 traceId
//獲取traceId
Map<String, String> mdcContextMap = MDC.getCopyOfContextMap();
return () ->{
//添加到子線程中
MDC.setContextMap(mdcContextMap);
System.out.println("你好呀!");
} 以上就是SpringBoot MDC全鏈路調(diào)用日志跟蹤實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot MDC日志跟蹤的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java利用JSch實(shí)現(xiàn)SSH遠(yuǎn)程操作的技術(shù)指南
在日常開發(fā)中,許多應(yīng)用需要通過 SSH 協(xié)議遠(yuǎn)程連接服務(wù)器來執(zhí)行命令、上傳或下載文件,JSch是一個功能強(qiáng)大的 Java 庫,它提供了便捷的接口來實(shí)現(xiàn) SSH 連接和其他遠(yuǎn)程管理功能,本文將介紹 JSch 的基本功能,并通過實(shí)際代碼示例幫助您快速上手,需要的朋友可以參考下2025-03-03
Java并發(fā)編程:CountDownLatch與CyclicBarrier和Semaphore的實(shí)例詳解
這篇文章主要介紹了Java并發(fā)編程:CountDownLatch與CyclicBarrier和Semaphore的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-09-09
play for scala 實(shí)現(xiàn)SessionFilter 過濾未登錄用戶跳轉(zhuǎn)到登錄頁面
這篇文章主要介紹了play for scala 實(shí)現(xiàn)SessionFilter 過濾未登錄用戶跳轉(zhuǎn)到登錄頁面的相關(guān)資料,需要的朋友可以參考下2016-11-11

