国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

SpringBoot+slf4j線(xiàn)程池全鏈路調用日志跟蹤問(wèn)題及解

發(fā)布時(shí)間:2021-07-06 11:13 來(lái)源:腳本之家 閱讀:0 作者:kevin_ying 欄目: 開(kāi)發(fā)技術(shù) 歡迎投稿:712375056

本項目源碼已在多個(gè)項目中實(shí)踐

接著(zhù),項目中使用了線(xiàn)程池,那么子線(xiàn)程中日志就會(huì )丟失traceId,下面講解如何實(shí)現子線(xiàn)程中的traceId日志跟蹤。

解決思路

子線(xiàn)程在打印日志的過(guò)程中traceId將丟失,解決方式為重寫(xiě)線(xiàn)程池,將主線(xiàn)程的traceId繼續傳遞到子線(xiàn)程中。當然,對于直接new創(chuàng )建線(xiàn)程的情況不考略【實(shí)際應用中應該避免這種用法】。

繼承ThreadPoolExecutor,重寫(xiě)執行任務(wù)的方法

public final class OverrideThreadPoolExecutor extends ThreadPoolExecutor {

    @Override
    public void execute(Runnable task) {
        super.execute(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()));
    }

    @Override
    public <T> Future<T> submit(Runnable task, T result) {
        return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()), result);
    }

    @Override
    public <T> Future<T> submit(Callable<T> task) {
        return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()));
    }

    @Override
    public Future<?> submit(Runnable task) {
        return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()));
    }
}

封裝ThreadMdcUtil工具類(lèi)

以封裝Callable為例:

  • 判斷當前線(xiàn)程對應MDC的Map是否存在,如果存在則設置子線(xiàn)程的ContextMap為當前線(xiàn)程的;
  • 如果不存在,則重新生成traceId;
  • 執行run方法
public final class ThreadMdcUtil {

    public static void setTraceIdIfAbsent() {
        if (MDC.get(TraceConstant.MDC_TRACE) == null || MDC.get(TraceConstant.MDC_TRACE).length() == 0) {
            String tid = UUID.randomUUID().toString().replace("-", "");
            MDC.put(TraceConstant.MDC_TRACE, tid);
        }
    }
   public static <T> Callable<T> wrap(final Callable<T> callable, final Map<String, String> context) {
        return () -> {
            if (context == null) {
                MDC.clear();
            } else {
                MDC.setContextMap(context);
            }
            setTraceIdIfAbsent();
            try {
                return callable.call();
            } finally {
                MDC.clear();
            }
        };
    }
}

測試子線(xiàn)程中traceId的傳遞,本項目中ExecutorService已經(jīng)重寫(xiě)了線(xiàn)程池

@RestController
@RequestMapping("trace")
@Slf4j
@AllArgsConstructor
public class TestTraceController {

    private final ExecutorService executorService;

    @GetMapping("traceLog")
    public String traceLog() {
        log.info("---接口調用了---");
        traceService();
        asyncTrace();
        return "success";
    }

    private void traceService(){
        log.error("## 執行traceService方法");
    }

    private void asyncTrace(){
        CompletableFuture.runAsync(()->{
            log.info("執行線(xiàn)程池中的方法asyncTrace,未重寫(xiě)了線(xiàn)程池");
        }, executorService);
    }

}

未重寫(xiě)ThreadPoolExecutor效果如下:

重寫(xiě)ThreadPoolExecutor效果如下:

到此這篇關(guān)于SpringBoot+slf4j線(xiàn)程池全鏈路調用日志跟蹤的文章就介紹到這了,更多相關(guān)SpringBoot全鏈路調用日志跟蹤內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

麻豆精产国品一二三产品| 天天爽夜夜爽人人爽| 国产精品一区二区 尿失禁| 中文成人在线 | 国产乱人伦偷精品视频,| 可以直接免费观看的AV网站|