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

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

 更新時間:2023年02月08日 09:31:23   作者:IT小馬哥  
這篇文章主要為大家介紹了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日志跟蹤的資料請關注腳本之家其它相關文章!

相關文章

  • 淺談Redis在微服務架構(gòu)中的幾種應用場景

    淺談Redis在微服務架構(gòu)中的幾種應用場景

    本文介紹在SpringCloud中使用Redis作為Pub/Sub異步通信、緩存或主數(shù)據(jù)庫和配置服務器的三種場景應用。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • java?BigDecimal類案例詳解

    java?BigDecimal類案例詳解

    這篇文章主要介紹了java?BigDecimal類案例詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-08-08
  • 分享Spring的下載組件

    分享Spring的下載組件

    這篇文章主要為大家分享了Spring的下載組件,感興趣的小伙伴們可以參考一下
    2016-05-05
  • SpringBoot通過redisTemplate調(diào)用lua腳本并打印調(diào)試信息到redis log(方法步驟詳解)

    SpringBoot通過redisTemplate調(diào)用lua腳本并打印調(diào)試信息到redis log(方法步驟詳解)

    這篇文章主要介紹了SpringBoot通過redisTemplate調(diào)用lua腳本 并打印調(diào)試信息到redis log,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • SpringBoot Controller接收參數(shù)的幾種常用方式

    SpringBoot Controller接收參數(shù)的幾種常用方式

    這篇文章主要介紹了SpringBoot Controller接收參數(shù)的幾種常用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java使用Jdom實現(xiàn)xml文件寫入操作實例

    java使用Jdom實現(xiàn)xml文件寫入操作實例

    這篇文章主要介紹了java使用Jdom實現(xiàn)xml文件寫入操作的方法,以完整實例形式分析了Jdom針對XML文件寫入操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Java?C++題解eetcode940不同的子序列?II

    Java?C++題解eetcode940不同的子序列?II

    這篇文章主要為大家介紹了Java?C++題解eetcode940不同的子序列?II實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • RestTemplate在Spring或非Spring環(huán)境下使用精講

    RestTemplate在Spring或非Spring環(huán)境下使用精講

    這篇文章主要為大家介紹了RestTemplate在Spring或非Spring環(huán)境下使用精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • java實現(xiàn)Spring在XML配置java類的方法

    java實現(xiàn)Spring在XML配置java類的方法

    下面小編就為大家?guī)硪黄猨ava實現(xiàn)Spring在XML配置java類的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • 實例講解Java并發(fā)編程之變量

    實例講解Java并發(fā)編程之變量

    這篇文章主要介紹了實例講解Java并發(fā)編程之變量,本文講解了編寫線程安全需要關心的共享變量和可變變量,需要的朋友可以參考下
    2015-04-04

最新評論