簡(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ā)哦!??!