終于找到多線程間日志唯一鏈路ID的解決方案了,你曉得了嘛?

簡(jiǎn)述:

繼之前我在《mdc 實(shí)現(xiàn)日志鏈路追蹤 方便迅速排查問(wèn)題》一文中拋出的問(wèn)題,MDC無(wú)法很好地實(shí)現(xiàn)多線程之間的值傳遞問(wèn)題,我自己私下也是抽空去找了,目前找到一個(gè)初次嘗試,效果還不錯(cuò)的方案,下面給大家介紹一下吧。

1、新建一個(gè)簡(jiǎn)單的spring boot 項(xiàng)目

目錄

2、引入依賴

<!--web項(xiàng)目所需-->
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 本次核心依賴 -->
        <dependency>
            <groupId>com.yomahub</groupId>
            <artifactId>tlog-all-spring-boot-starter</artifactId>
            <version>1.3.1</version>
</dependency>

3、編寫(xiě)logback.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <property name="APP_NAME" value="logtest"/>
    <property name="LOG_HOME" value="./logs" />
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--這里替換成AspectLogbackEncoder-->
        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

4、新建一個(gè)service類(lèi) TestService

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class TestService {
    public void test(int n) {
        log.info("service輸出內(nèi)容:{}", n);
    }
}

5、新建一個(gè)測(cè)試接口類(lèi) TestThread,并注入service

import com.example.spring_hibernate.service.TestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;

@RestController
@Slf4j
public class TestThread {

    @Autowired
    private TestService testService;

    @GetMapping(value = "/hello")
    public void get() {
        //構(gòu)建兩個(gè)線程池
        ExecutorService executorService = new ScheduledThreadPoolExecutor(4);
        ExecutorService executorService2 = new ScheduledThreadPoolExecutor(2);
        for (int i = 0; i < 10; i++) {
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    log.info(Thread.currentThread().getName() + ">>線程名>>" + System.currentTimeMillis());
                    //啟動(dòng)線程池2
                   executorService2.submit(new Runnable() {

                        @Override
                        public void run() {
                            log.info("線程池2》》" + Thread.currentThread().getName());
                            //調(diào)用service方法
                            testService.test(4);
                        }
                    });
                }
            });
        }
    }
}

6、OK,啟動(dòng)項(xiàng)目,測(cè)試接口,注意查看日志輸出。

啟動(dòng)成功
日志輸出
兩次對(duì)比

OK,是不是很nice,感興趣的道友,可以去看看它的底層源碼哦。

好了,若覺(jué)得此文章還不錯(cuò),記得點(diǎn)贊評(píng)論轉(zhuǎn)發(fā)哦!??!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡(jiǎn)述 繼之前說(shuō)的《spring aop 自動(dòng)打印接口的出入?yún)⑷罩荆鼘W⒂跇I(yè)務(wù)邏輯[https://www.jia...
    技術(shù)指北閱讀 2,118評(píng)論 1 13
  • java各日志組件介紹 common-logging(同時(shí)也稱JCL) ??common-logging是 apa...
    良辰美景TT閱讀 1,782評(píng)論 0 2
  • SMTPAppender SMTPAppender 收集日志事件到一個(gè)或多個(gè)固定大小的緩沖區(qū),當(dāng)用戶指定的事件發(fā)生...
    ChinaXieShuai閱讀 2,324評(píng)論 0 0
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 本文發(fā)表于2016年6月,寫(xiě)于作者學(xué)生時(shí)期。文中使用到的技術(shù)和框架可能不是當(dāng)下最佳實(shí)踐,甚至很不“優(yōu)雅”。但對(duì)于剛...
    小白白程序猿閱讀 225評(píng)論 0 0

友情鏈接更多精彩內(nèi)容