精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何使用 SLF4J 的 MDC, 實(shí)現(xiàn)全鏈路追蹤?

開發(fā)
本文我們分析了如何使用MDC?實(shí)現(xiàn)全鏈路追蹤,通過合理使用 SLF4J的MDC?,可以在分布式系統(tǒng)中實(shí)現(xiàn)全鏈路的 traceId 追蹤,提升日志的可讀性和追蹤能力。

在分布式系統(tǒng)或微服務(wù)架構(gòu)中,全鏈路追蹤(Full-Chain Tracing) 對診斷和監(jiān)控系統(tǒng)的性能至關(guān)重要。這篇文章,我們將詳細(xì)介紹如何使用 SLF4J 的 MDC 實(shí)現(xiàn)全鏈路的 traceId。

1. 什么是 SLF4J 的MDC?

MDC(Mapped Diagnostic Context,映射診斷上下文)是 SLF4J 提供的一種上下文機(jī)制,它允許在日志記錄時附加一些關(guān)鍵的上下文信息(如 traceId、userId 等),這些信息可以在日志格式中被引用,從而豐富日志內(nèi)容,便于后續(xù)的日志分析和追蹤。

2. 如何實(shí)現(xiàn)全鏈路 traceId?

(1) 生成或提取 traceId

在請求的入口點(diǎn),通常來說是客戶端(比如瀏覽器、移動應(yīng)用等,也可以是 Web 控制器、服務(wù)網(wǎng)關(guān)等)生成一個唯一的 traceId,

import org.slf4j.MDC;
import java.util.UUID;

public void handleRequest(HttpServletRequest request) {
    String traceId = request.getHeader("X-Trace-Id");
    if (traceId == null || traceId.isEmpty()) {
        traceId = UUID.randomUUID().toString();
    }
    MDC.put("traceId", traceId);
    try {
        // 處理請求的業(yè)務(wù)邏輯
    } finally {
        MDC.remove("traceId"); // 確保線程安全,避免內(nèi)存泄漏
    }
}

(2) 配置日志格式以包含 traceId

在日志配置文件(如 logback.xml 或 log4j2.xml)中,將 traceId 添加到日志輸出格式中。例如,使用 Logback 時:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}] [traceId:%X{traceId}] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

這樣,每條日志都會包含 traceId,便于后續(xù)追蹤。

(3) 傳播 traceId 到下游服務(wù)

當(dāng)一個服務(wù)調(diào)用下游服務(wù)時,需要確保 traceId 被傳遞。通常通過 HTTP 頭部傳遞,例如使用X-Trace-Id或者tracestate 頭:

import org.springframework.web.client.RestTemplate;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpEntity;

public void callDownstreamService() {
    String traceId = MDC.get("traceId");
    HttpHeaders headers = new HttpHeaders();
    headers.set("X-Trace-Id", traceId);
    HttpEntity<String> entity = new HttpEntity<>(headers);
    
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.exchange("http://downstream-service/api", HttpMethod.GET, entity, String.class);
}

(4) 在下游服務(wù)中設(shè)置 traceId 到 MDC

下游服務(wù)在接收到請求時,需要從請求頭中提取 traceId 并設(shè)置到 MDC:

public void handleDownstreamRequest(HttpServletRequest request) {
    String traceId = request.getHeader("X-Trace-Id");
    if (traceId != null && !traceId.isEmpty()) {
        MDC.put("traceId", traceId);
    } else {
        traceId = UUID.randomUUID().toString();
        MDC.put("traceId", traceId);
    }
    try {
        // 業(yè)務(wù)邏輯處理
    } finally {
        MDC.remove("traceId");
    }
}

(5) 處理多線程環(huán)境下的 traceId 傳播

在多線程環(huán)境中,如使用線程池或異步任務(wù),MDC 的上下文默認(rèn)不會自動傳播到子線程。需要手動傳遞 traceId:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public void executeAsyncTask() {
    String traceId = MDC.get("traceId");
    ExecutorService executor = Executors.newFixedThreadPool(10);
    executor.submit(() -> {
        MDC.put("traceId", traceId);
        try {
            // 異步任務(wù)邏輯
        } finally {
            MDC.remove("traceId");
        }
    });
}

為了簡化多線程環(huán)境下的 MDC 傳播,可以使用像 MDC Decorator 或自定義 Executor 來自動管理 MDC。

3. 使用攔截器或過濾器統(tǒng)一管理 traceId

為了避免在每個請求處理方法中手動設(shè)置和清理 traceId,可以使用 Spring 的攔截器(Interceptor)或 Servlet 過濾器(Filter)來統(tǒng)一管理:

示例:使用 Spring 的 OncePerRequestFilter

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.MDC;
import org.springframework.web.filter.OncePerRequestFilter;

publicclass TraceIdFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain filterChain)
            throws ServletException, IOException {
        String traceId = request.getHeader("X-Trace-Id");
        if (traceId == null || traceId.isEmpty()) {
            traceId = UUID.randomUUID().toString();
        }
        MDC.put("traceId", traceId);
        try {
            filterChain.doFilter(request, response);
        } finally {
            MDC.remove("traceId");
        }
    }
}

將該過濾器注冊到 Spring 容器中即可。

4. 示例代碼

(1) 過濾器類

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.MDC;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;
import java.util.UUID;

publicclass TraceIdFilter extends OncePerRequestFilter {
    privatestaticfinal String TRACE_ID_HEADER = "X-Trace-Id";

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain filterChain)
            throws ServletException, IOException {
        String traceId = request.getHeader(TRACE_ID_HEADER);
        if (traceId == null || traceId.isEmpty()) {
            traceId = UUID.randomUUID().toString();
        }
        MDC.put("traceId", traceId);
        try {
            filterChain.doFilter(request, response);
        } finally {
            MDC.remove("traceId");
        }
    }
}

(2) Spring Boot 中注冊過濾器

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;

@Configuration
publicclass WebConfig {
    @Bean
    public FilterRegistrationBean<TraceIdFilter> traceIdFilter() {
        FilterRegistrationBean<TraceIdFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new TraceIdFilter());
        registrationBean.addUrlPatterns("/*"); // 過濾所有請求
        registrationBean.setOrder(1); // 優(yōu)先級
        return registrationBean;
    }
}

(3) 日志配置(logback.xml)

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}] [traceId:%X{traceId}] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

5. 注意事項(xiàng)

在使用一項(xiàng)技術(shù)或者一個框架時,我們都需要知道有什么弊端,這樣才能更好的幫助我們做好技術(shù)決策,下面是使用MDC需要注意的事項(xiàng):

  • 線程安全:在多線程環(huán)境下,確保 MDC 的設(shè)置和清理,以避免 traceId 泄漏到其他線程。
  • 性能影響:頻繁操作 MDC 可能略微影響性能,需權(quán)衡日志詳細(xì)程度和性能需求。
  • 日志存儲:確保日志存儲系統(tǒng)支持和索引 traceId,以便高效查詢和分析。
  • 異常處理:在異常情況下,確保 traceId 仍能正確記錄在日志中,有助于快速定位問題。

6. 總結(jié)

本文,我們分析了如何使用MDC實(shí)現(xiàn)全鏈路追蹤,通過合理使用 SLF4J的MDC,可以在分布式系統(tǒng)中實(shí)現(xiàn)全鏈路的 traceId 追蹤,提升日志的可讀性和追蹤能力。但是,對于更復(fù)雜的需求,我們還是建議結(jié)合專門的分布式追蹤工具,比如 Spring Cloud Sleuth、Zipkin 或 Jaeger,以獲得更全面的追蹤能力。

責(zé)任編輯:趙寧寧 來源: 猿java
相關(guān)推薦

2025-01-20 08:10:00

微服務(wù)架構(gòu)SLF4J

2025-10-10 08:58:13

2023-01-11 21:22:32

Java服務(wù)器

2022-05-23 08:23:24

鏈路追蹤SleuthSpring

2024-03-01 16:52:02

SLF4J日志框架

2023-10-28 16:19:18

Android日志

2013-02-20 09:42:34

JavaLogbackSLF4J

2016-10-21 13:10:18

javalog4jslf4j

2020-01-07 10:06:26

Slf4jLog4JLogback

2023-10-16 23:43:52

云原生可觀測性

2023-01-30 22:34:44

Node.js前端

2023-10-07 10:08:54

2022-07-22 07:59:17

日志方案

2023-11-14 09:04:15

用戶節(jié)點(diǎn)不可用

2021-03-15 18:47:25

日志開發(fā)源碼

2022-12-30 08:31:27

MDC查詢?nèi)罩?/a>

2022-01-05 08:27:17

C++全鏈路追蹤

2022-09-15 10:03:42

Jaeger分布式追蹤系統(tǒng)

2024-03-01 08:17:28

SLF4J日志框架

2023-08-24 22:13:31

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

亚洲精品自拍第一页| 亚洲色图清纯唯美| 日本不卡免费高清视频| 国产三级黄色片| 欧美日韩黄网站| 欧美日韩国产中字| 日本成人a网站| 国产成人免费视频网站高清观看视频| 欧美成人精品一区二区| 漂亮人妻被黑人久久精品| 亚洲第一二三四区| 亚洲综合一区二区三区| 四虎影院一区二区三区| www.五月激情| 日韩av电影天堂| 欧美国产精品va在线观看| 91中文字幕永久在线| 久久的色偷偷| 色欧美片视频在线观看 | 秋霞欧美视频| 精品久久久久一区二区国产| 91看片在线免费观看| 日本高清成人vr专区| 国产女人aaa级久久久级| 国产美女精品在线观看| 亚洲无码精品国产| 一区二区三区国产在线| 久久91亚洲精品中文字幕| 欧美人妻一区二区三区| 成人18夜夜网深夜福利网| 欧美日韩高清不卡| 久久久久久久片| 精品丝袜在线| 亚洲一区二区av在线| 国产又大又长又粗又黄| 成人高清网站| 久久久久99精品国产片| 精品免费一区二区三区蜜桃| www.国产黄色| 国产精品911| 成人啪啪免费看| 亚洲在线视频播放| 免费国产亚洲视频| 国产精品吊钟奶在线| 六月丁香激情综合| 国产亚洲福利| 91精品国产精品| 日韩毛片在线播放| 在线高清一区| 97在线观看免费| 日韩精品一区二区av| 亚洲麻豆视频| 韩国视频理论视频久久| 狠狠躁夜夜躁人人爽天天高潮| 欧美一区二区三区免费看| 久久精品亚洲一区| 黄色录像免费观看| 中出一区二区| 欧美激情一级欧美精品| 伊人国产在线观看| 最新亚洲视频| 欧美一区二区三区图| 中日韩黄色大片| 久久精品系列| 国产精品女人久久久久久| 人人妻人人爽人人澡人人精品| 视频在线观看一区| 国产精品视频永久免费播放| 中文字幕网址在线| 激情六月婷婷综合| 99视频网站| 午夜成人鲁丝片午夜精品| 91美女片黄在线观看| 蜜桃传媒一区二区| 成年人视频网站在线| 1024成人网| 草草视频在线免费观看| 欧美成人性网| 欧美区一区二区三区| 女同性αv亚洲女同志| 久久视频在线观看| 亚洲视频欧美视频| 91精品少妇一区二区三区蜜桃臀| 欧美激情1区| 国产91精品久久久久| 亚洲午夜无码久久久久| 国产自产高清不卡| 精品国产乱码久久久久久丨区2区| 深夜福利在线看| 国产日韩高清在线| 91精品国产吴梦梦| 超碰一区二区| 6080午夜不卡| 久久久久麻豆v国产精华液好用吗 在线观看国产免费视频 | 最新国产精品自拍| 亚洲福利天堂| 久久久国产精品x99av| 日本熟女一区二区| 免费在线视频一区| 国产v亚洲v天堂无码| www.亚洲免费| 亚洲国产aⅴ成人精品无吗| 男人搞女人网站| 我要色综合中文字幕| 亚洲乱码国产乱码精品精| 永久免费看片直接| 老司机一区二区三区| 99在线观看视频| 99re在线视频| 欧美丝袜第一区| 中文字幕avav| av永久不卡| 97在线视频国产| 国产免费福利视频| 国产午夜亚洲精品羞羞网站| 99在线观看视频免费| 国产精品亚洲d| 日韩不卡在线观看| 欧美 日韩 国产 一区二区三区| 美女网站久久| 精品乱色一区二区中文字幕| 精品国产99久久久久久| 欧美在线观看视频在线| 男女性杂交内射妇女bbwxz| 97精品在线| 国产成人中文字幕| 国内爆初菊对白视频| 中文字幕一区av| 992kp快乐看片永久免费网址| 国产精品极品| 欧美另类在线观看| 国产又粗又猛又爽| 欧美激情一区三区| 亚洲精品一二三四五区| 群体交乱之放荡娇妻一区二区| 欧美人成在线视频| 国产高清视频免费| 亚洲欧洲成人av每日更新| 999精品视频在线| 台湾亚洲精品一区二区tv| 久久久久久久久久久国产| 国产成人精品免费看视频| 中文字幕综合网| 亚洲欧美日本一区二区三区| 日本女优一区| 国产精品国产自产拍高清av水多| 日本在线视频1区| 精品国产户外野外| 一起草在线视频| 性色一区二区三区| 鲁鲁狠狠狠7777一区二区| 日本在线啊啊| 亚洲欧美激情四射在线日| 人妻 日韩精品 中文字幕| 99精品久久只有精品| 免费在线a视频| 一本色道久久综合亚洲精品酒店 | 国产高清中文字幕| 91麻豆精东视频| 成人观看免费完整观看| 女优一区二区三区| 国产精品久久久一区| 色影视在线观看| 91精品久久久久久蜜臀| 欧美日韩在线视频免费| 成人av网站在线观看| 日韩av三级在线| 沈樵精品国产成av片| 国产精品高清免费在线观看| 男人的天堂在线视频免费观看 | 四虎1515hh.com| 欧美精品1区| 国产亚洲精品自在久久| 樱桃视频成人在线观看| 在线激情影院一区| av一区二区三| 欧美日韩国产在线| 国产精品久久免费观看| 国产一区二区精品久久91| 国产freexxxx性播放麻豆| 日韩深夜福利| 国产精品专区第二| 第一中文字幕在线| 国产午夜精品一区二区三区| 91福利免费视频| 亚洲一区自拍偷拍| av网在线播放| 国产福利精品导航| 免费午夜视频在线观看| 97精品在线| 久久久久久欧美精品色一二三四| 国产一区二区三区朝在线观看| 美女国内精品自产拍在线播放| 四虎免费在线观看| 欧美日韩国产不卡| 亚洲国产综合久久| 国产精品国产三级国产aⅴ中文| 国产精品99精品无码视亚| 日韩精品亚洲专区| 国产91在线亚洲| 日韩三级在线| 精品91免费| 国产精品成人**免费视频| 91精品国产色综合| av片在线观看永久免费| 国产一区二区三区18| 天天舔天天干天天操| 这里是久久伊人| 91午夜精品亚洲一区二区三区| 一个色综合av| 成人无码精品1区2区3区免费看 | 日本不卡二区高清三区| 欧美久久亚洲| 国产精品久久中文| 欧美调教sm| 久久久久久网站| 99久久精品免费观看国产| 亚洲性线免费观看视频成熟| 隣の若妻さん波多野结衣| 欧美美女激情18p| 亚洲不卡在线视频| 精品久久久久久国产| 日韩在线中文字幕视频| 国产精品免费免费| 能免费看av的网站| wwwwww.欧美系列| 一级少妇精品久久久久久久| 国产自产v一区二区三区c| 超碰在线公开97| 奇米影视7777精品一区二区| 91黄色小网站| 老牛嫩草一区二区三区日本| 日本免费不卡一区二区| 亚洲狠狠婷婷| 欧美精品久久久久久久久久久| 亚洲人体av| 四虎免费在线观看视频| 9999国产精品| 一区二区三区国产福利| 成人3d动漫在线观看| 日本精品一区| 国产区精品区| 日韩一本精品| 欧美好骚综合网| 中文网丁香综合网| 久久精品青草| 视色,视色影院,视色影库,视色网| 欧美激情成人| 男女裸体影院高潮| 欧美精品一卡| 日本熟妇人妻xxxx| 一区二区三区精品视频在线观看| av7777777| 免费在线欧美黄色| 美女网站免费观看视频| 日本欧美一区二区| 五月婷婷丁香综合网| 精油按摩中文字幕久久| 99精品999| 国产成人免费视频精品含羞草妖精| 日本黄色三级网站| 成人激情综合网站| 在线免费观看麻豆| 国产精品丝袜91| 国产少妇在线观看| 午夜视频在线观看一区二区三区 | 黄色网页在线观看| 久久天堂av综合合色| 日韩av官网| 欧美在线视频在线播放完整版免费观看 | 久久中文资源| 日韩国产伦理| 亚洲最新色图| 99久久国产综合精品五月天喷水| 亚洲欧美成人| 亚洲天堂av一区二区| 国产成人在线观看| 亚洲永久无码7777kkk| 久久久久久黄色| 五月天av网站| 狠狠色狠狠色综合日日小说| 国产精品高清无码| 日韩精品一区二区三区swag | 视频一区中文字幕精品| 国产在线一区二区三区四区| 成人久久电影| 精品无码国产一区二区三区av| 日韩高清不卡一区二区三区| 无码国产精品一区二区高潮| 99精品一区二区三区| 久久久免费看片| 亚洲国产sm捆绑调教视频| 波多野结衣av无码| 日韩美女一区二区三区| 你懂的视频在线| 美日韩精品免费视频| 不卡一二三区| 国产福利久久| 91视频一区| 无码aⅴ精品一区二区三区浪潮| 另类欧美日韩国产在线| 国产激情视频网站| 日韩一区中文字幕| 国产一级一级国产| 欧美videofree性高清杂交| 第一福利在线| 91sa在线看| 亚洲成人黄色| 亚洲欧洲在线一区| 久久www成人_看片免费不卡| 最新中文字幕日本| 国产精品久久久久久久久搜平片 | 免费黄色片网站| 亚洲成人av在线电影| 国产又粗又长又黄| 一区二区三区四区精品| 自拍一区在线观看| 国产精品日韩一区二区免费视频| 99re久久最新地址获取| 久久国产色av免费观看| 成人18视频日本| 精品99久久久久成人网站免费 | 国产91精品不卡视频| 亚洲日本视频在线| 亚洲精品免费在线看| 老司机精品久久| 添女人荫蒂视频| 性做久久久久久免费观看| 亚洲爱情岛论坛永久| 久久久精品2019中文字幕神马| 欧美日韩激情电影| 欧美在线视频二区| 国产欧美日本| 99久久免费看精品国产一区| 亚洲九九爱视频| 国产视频在线观看免费| 日韩在线欧美在线国产在线| 亚洲成人av观看| 日韩精品资源| 日本网站在线观看一区二区三区| 中文字幕第4页| 91成人在线精品| 国产视频精品久久| 国产成人97精品免费看片| 免费观看久久av| 日韩精品无码一区二区三区免费| 久久综合资源网| 日韩手机在线视频| 亚洲丝袜在线视频| 国产激情欧美| 曰韩不卡视频| 国产乱码一区二区三区| 免费日韩在线视频| 亚洲第一黄色网| 三妻四妾完整版在线观看电视剧| 鲁鲁视频www一区二区| 久久精品动漫| 国产精品视频在| 欧美一级爆毛片| 2018av在线| 欧美日韩综合久久| 男女性色大片免费观看一区二区 | 在线免费观看一区| yiren22综合网成人| 成人在线视频网站| 亚洲国内欧美| 男人的天堂官网| 5566中文字幕一区二区电影| 日韩电影免费观看| 免费精品视频一区| 麻豆视频一区二区| 欧美日韩在线视频免费| 日韩电影免费观看中文字幕 | 91免费看蜜桃| 一本色道久久综合| www.4hu95.com四虎| 日韩欧美亚洲国产精品字幕久久久 | 欧美激情视频一区二区三区不卡| 精品视频高潮| 国产又大又黄又粗的视频| 一区二区三区在线看| 欧洲视频在线免费观看| 成人女保姆的销魂服务| 99视频精品免费观看| 中文字幕第二区| 精品国产伦一区二区三区观看体验| 日韩电影免费观| 日本一级淫片演员| 97久久超碰精品国产| 中文字幕日本人妻久久久免费| 欧美黑人国产人伦爽爽爽| 精品国产一区探花在线观看 | 久久久久九九视频| 国产精品一二三四五区| 51久久精品夜色国产麻豆| 欧美国产一区二区三区激情无套| www.88av| 日韩区在线观看| 亚洲精品一区三区三区在线观看| 亚洲国产一二三精品无码 |