SpringBoot MDC全鏈路調(diào)用日志跟蹤實現(xiàn)詳解
MDC 介紹
MDC(Mapped Diagnostic Context,映射調(diào)試上下文)是 log4j 、logback及l(fā)og4j2 提供的一種方便在多線程條件下記錄日志的功能。MDC 可以看成是一個與當前線程綁定的哈希表,可以往其中添加鍵值對。MDC 中包含的內(nèi)容可以被同一線程中執(zhí)行的代碼所訪問。當前線程的子線程會繼承其父線程中的 MDC 的內(nèi)容。當需要記錄日志時,只需要從 MDC 中獲取所需的信息即可。MDC 的內(nèi)容則由程序在適當?shù)臅r候保存進去。對于一個 Web 應用來說,通常是在請求被處理的最開始保存這些數(shù)據(jù)。
API 說明
- clear() => 移除所有 MDC
- get (String key) => 獲取當前線程 MDC 中指定 key 的值
- getContext() => 獲取當前線程 MDC 的 MDC
- put(String key, Object o) => 往當前線程的 MDC 中存入指定的鍵值對
- remove(String key) => 刪除當前線程 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"/>
重點是 %X{traceId},traceId 和 MDC 中的鍵名稱一致。
簡單使用就這么容易,但是在有些情況下 traceId 將獲取不到。
常見問題
子線程日志打印丟失 traceId
//獲取traceId Map<String, String> mdcContextMap = MDC.getCopyOfContextMap(); return () ->{ //添加到子線程中 MDC.setContextMap(mdcContextMap); System.out.println("你好呀!"); }
以上就是SpringBoot MDC全鏈路調(diào)用日志跟蹤實現(xiàn)詳解的詳細內(nèi)容,更多關于SpringBoot MDC日志跟蹤的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot通過redisTemplate調(diào)用lua腳本并打印調(diào)試信息到redis log(方法步驟詳解)
這篇文章主要介紹了SpringBoot通過redisTemplate調(diào)用lua腳本 并打印調(diào)試信息到redis log,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02SpringBoot Controller接收參數(shù)的幾種常用方式
這篇文章主要介紹了SpringBoot Controller接收參數(shù)的幾種常用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07RestTemplate在Spring或非Spring環(huán)境下使用精講
這篇文章主要為大家介紹了RestTemplate在Spring或非Spring環(huán)境下使用精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03java實現(xiàn)Spring在XML配置java類的方法
下面小編就為大家?guī)硪黄猨ava實現(xiàn)Spring在XML配置java類的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11