老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

日志排查問題困難?分布式日志鏈路跟蹤來幫你

一、背景

開發(fā)排查系統(tǒng)問題用得最多的手段就是查看系統(tǒng)日志,在分布式環(huán)境中一般使用ELK來統(tǒng)一收集日志,但是在并發(fā)大時使用日志定位問題還是比較麻煩,由于大量的其他用戶/其他線程的日志也一起輸出穿行其中導(dǎo)致很難篩選出指定請求的全部相關(guān)日志,以及下游線程/服務(wù)對應(yīng)的日志。

創(chuàng)新互聯(lián)是專業(yè)的遷安網(wǎng)站建設(shè)公司,遷安接單;提供成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行遷安網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

二、解決思路

  • 每個請求都使用一個唯一標識來追蹤全部的鏈路顯示在日志中,并且不修改原有的打印方式(代碼無***)
  • 使用Logback的MDC機制日志模板中加入traceId標識,取值方式為%X{traceId}

    MDC(Mapped Diagnostic Context,映射調(diào)試上下文)是 log4j 和 logback 提供的一種方便在多線程條件下記錄日志的功能。MDC 可以看成是一個與當前線程綁定的Map,可以往其中添加鍵值對。MDC 中包含的內(nèi)容可以被同一線程中執(zhí)行的代碼所訪問。當前線程的子線程會繼承其父線程中的 MDC 的內(nèi)容。當需要記錄日志時,只需要從 MDC 中獲取所需的信息即可。MDC 的內(nèi)容則由程序在適當?shù)臅r候保存進去。對于一個 Web 應(yīng)用來說,通常是在請求被處理的最開始保存這些數(shù)據(jù)。


三、方案實現(xiàn)

由于MDC內(nèi)部使用的是ThreadLocal所以只有本線程才有效,子線程和下游的服務(wù)MDC里的值會丟失;所以方案主要的難點是解決值的傳遞問題。

3.1. 修改日志模板

logback配置文件模板格式添加標識%X{traceId}
日志排查問題困難?分布式日志鏈路跟蹤來幫你


3.2. 網(wǎng)關(guān)添加過濾器

生成traceId并通過header傳遞給下游服務(wù)

@Component
public class TraceFilter extends ZuulFilter {
    @Autowired
    private TraceProperties traceProperties;

    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        return FORM_BODY_WRAPPER_FILTER_ORDER - 1;
    }

    @Override
    public boolean shouldFilter() {
        //根據(jù)配置控制是否開啟過濾器
        return traceProperties.getEnable();
    }

    @Override
    public Object run() {
        //鏈路追蹤id
        String traceId = IdUtil.fastSimpleUUID();
        MDC.put(CommonConstant.LOG_TRACE_ID, traceId);
        RequestContext ctx = RequestContext.getCurrentContext();
        ctx.addZuulRequestHeader(CommonConstant.TRACE_ID_HEADER, traceId);
        return null;
    }
}


3.3. 下游服務(wù)增加spring攔截器

接收并保存traceId的值
攔截器

public class TraceInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String traceId = request.getHeader(CommonConstant.TRACE_ID_HEADER);
        if (StrUtil.isNotEmpty(traceId)) {
            MDC.put(CommonConstant.LOG_TRACE_ID, traceId);
        }
        return true;
    }
}

注冊攔截器

public class DefaultWebMvcConfig extends WebMvcConfigurationSupport {
  @Override
  protected void addInterceptors(InterceptorRegistry registry) {
    //日志鏈路追蹤攔截器
    registry.addInterceptor(new TraceInterceptor()).addPathPatterns("/**");

    super.addInterceptors(registry);
  }
}


3.4. 下游服務(wù)增加feign攔截器

繼續(xù)把當前服務(wù)的traceId值傳遞給下游服務(wù)

public class FeignInterceptorConfig {
    @Bean
    public RequestInterceptor requestInterceptor() {
        RequestInterceptor requestInterceptor = template -> {
            //傳遞日志traceId
            String traceId = MDC.get(CommonConstant.LOG_TRACE_ID);
            if (StrUtil.isNotEmpty(traceId)) {
                template.header(CommonConstant.TRACE_ID_HEADER, traceId);
            }
        };
        return requestInterceptor;
    }
}


3.5. 擴展線程池

主要針對業(yè)務(wù)會使用線程池(異步、并行處理),并且spring自己也有@Async注解來使用線程池,所以需要擴展ThreadPoolTaskExecutor線程池實現(xiàn)將父線程的MDC內(nèi)容復(fù)制給子線程

public class CustomThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
    /**
     * 把父線程的MDC內(nèi)容賦值給子線程
     * @param runnable
     */
    @Override
    public void execute(Runnable runnable) {
        Map mdcContext = MDC.getCopyOfContextMap();
        super.execute(() -> run(runnable, mdcContext));
    }

    @Override
    public  Future submit(Callable task) {
        Map mdcContext = MDC.getCopyOfContextMap();
        return super.submit(() -> call(task, mdcContext));
    }

    /**
     * 子線程委托的執(zhí)行方法
     * @param runnable {@link Runnable}
     * @param mdcContext 父線程MDC內(nèi)容
     */
    private void run(Runnable runnable, String tenantId, Map mdcContext) {
        // 將父線程的MDC內(nèi)容傳給子線程
        if (mdcContext != null) {
            MDC.setContextMap(mdcContext);
        }
        try {
            // 執(zhí)行異步操作
            runnable.run();
        } finally {
            // 清空MDC內(nèi)容
            MDC.clear();
        }
    }

    /**
     * 子線程委托的執(zhí)行方法
     * @param task {@link Callable}
     * @param mdcContext 父線程MDC內(nèi)容
     */
    private  T call(Callable task, Map mdcContext) throws Exception {
        // 將父線程的MDC內(nèi)容傳給子線程
        if (mdcContext != null) {
            MDC.setContextMap(mdcContext);
        }
        try {
            // 執(zhí)行異步操作
            return task.call();
        } finally {
            // 清空MDC內(nèi)容
            MDC.clear();
        }
    }
}


四、場景測試

4.1. 測試代碼如下

日志排查問題困難?分布式日志鏈路跟蹤來幫你

4.2. api網(wǎng)關(guān)打印的日志

網(wǎng)關(guān)生成traceId值為13d9800c8c7944c78a06ce28c36de670
日志排查問題困難?分布式日志鏈路跟蹤來幫你

4.3. 請求跳轉(zhuǎn)到文件服務(wù)時打印的日志

顯示的traceId與網(wǎng)關(guān)相同,這里特意模擬發(fā)生異常的場景
日志排查問題困難?分布式日志鏈路跟蹤來幫你

4.4. ELK聚合日志通過traceId查詢整條鏈路日志

當系統(tǒng)出現(xiàn)異常時,可直接通過該異常日志的traceId的值,在日志中心中詢該請求的所有日志信息
日志排查問題困難?分布式日志鏈路跟蹤來幫你


五、源碼地址

附上我的開源微服務(wù)框架(包含本文中的代碼),歡迎 star 關(guān)注

https://gitee.com/zlt2000/microservices-platform

推薦閱讀

  • Spring Cloud開發(fā)人員如何解決服務(wù)沖突和實例亂竄?
  • zuul集成Sentinel最新的網(wǎng)關(guān)流控組件
  • 阿里注冊中心Nacos生產(chǎn)部署方案
  • Spring Boot自定義配置項在IDE里面實現(xiàn)自動提示
  • Spring Cloud Zuul的動態(tài)路由怎樣做?集成Nacos實現(xiàn)很簡單

新聞名稱:日志排查問題困難?分布式日志鏈路跟蹤來幫你
標題網(wǎng)址:http://www.xueling.net.cn/article/ipopss.html

其他資訊

在線咨詢
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 国产美女视频黄a片免费观看软件 | 一夲道无码人妻精品一区二区 | 班花在教室轮流澡到高潮视频 | 亚洲码视频 | 亚洲欧洲无码专区AV | 91影院在线观看视频 | 少妇人妻无码精品视频 | 色8久久久噜噜噜久久 | 亚洲乱码一区二区三区四区 | 成人欧美一区二区三区色青冈 | 久久亚洲精品国产精品777777 | 日韩色网址 | 成人影院欧美黄色 | 97色视| 国产亚洲精品久久久久久老妇 | 97精品国产99久久久久久免费 | 中文字幕日韩精 | 欧美福利视频一区二区 | 国产一在线精品一区在线观看 | a级黄色片子 | 婷婷六月国产精品久久不卡 | 国产精品一级毛片无码老人 | 中文字幕韩在线第一页 | 被仇人调教成禁脔h虐 | aaaa一级毛片 | 国产亚洲欧美日韩二三线 | AV天堂亚洲区无码先锋影音 | 国产综合影院 | av无码国产在线观看岛国 | 少妇大叫太大太粗太爽了A片 | 91麻豆精品国产91久久久使用方法 | 深夜影院在线观看 | 欧美精品激情在线 | 无码人妻精品中文字幕 | 久久天天躁狠狠躁夜夜97 | 欧美第一在线视频 | 色妺妺在线视频 | 一本大道香蕉久中文在线播放 | 毛片网站视频 | 成人亚洲免费视频 | 国产视频1区 |