欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot MDC全鏈路調(diào)用日志跟蹤實(shí)現(xiàn)詳解

 更新時(shí)間:2023年02月08日 09:31:23   作者:IT小馬哥  
這篇文章主要為大家介紹了SpringBoot MDC全鏈路調(diào)用日志跟蹤實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

MDC 介紹

MDC(Mapped Diagnostic Context,映射調(diào)試上下文)是 log4j 、logback及l(fā)og4j2 提供的一種方便在多線程條件下記錄日志的功能。MDC 可以看成是一個(gè)與當(dāng)前線程綁定的哈希表,可以往其中添加鍵值對。MDC 中包含的內(nèi)容可以被同一線程中執(zhí)行的代碼所訪問。當(dāng)前線程的子線程會(huì)繼承其父線程中的 MDC 的內(nèi)容。當(dāng)需要記錄日志時(shí),只需要從 MDC 中獲取所需的信息即可。MDC 的內(nèi)容則由程序在適當(dāng)?shù)臅r(shí)候保存進(jìn)去。對于一個(gè) 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)文章

最新評論