springboot?sleuth?日志跟蹤問(wèn)題記錄
springboot sleuth 日志跟蹤
Spring Cloud Sleuth是一個(gè)在應(yīng)用中實(shí)現(xiàn)日志跟蹤的強(qiáng)有力的工具。使用Sleuth庫(kù)可以應(yīng)用于計(jì)劃任務(wù) 、多線程服務(wù)或復(fù)雜的Web請(qǐng)求,尤其是在一個(gè)由多個(gè)服務(wù)組成的系統(tǒng)中。當(dāng)我們?cè)谶@些應(yīng)用中來(lái)診斷問(wèn)題時(shí),即使有日志記錄也很難判斷出一個(gè)請(qǐng)求需要將哪些操作關(guān)聯(lián)在一起。
如果想要診斷復(fù)雜操作,通常的解決方案是在請(qǐng)求中傳遞唯一的ID到每個(gè)方法來(lái)識(shí)別日志。而Sleuth可以與日志框架Logback、SLF4J輕松地集成,通過(guò)添加獨(dú)特的標(biāo)識(shí)符來(lái)使用日志跟蹤和診斷問(wèn)題。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> <version>2.1.1.RELEASE</version> </dependency>
SLF4J 配置 http://www.dbjr.com.cn/article/71692.htm
在使用slf4j打印日志時(shí)會(huì)打印traceId,通過(guò)這ID可以把整個(gè)請(qǐng)求鏈給找出來(lái).
如下是打印出來(lái)的實(shí)例
2019-06-19 17:16:21.453 [00c62017e97b7823,00c62017e97b7823] [http-nio-8777-exec-1]
需要把traceId給前端,使用aop,在每個(gè)返回結(jié)果中增加traceId字段
import brave.Tracer; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import com.google.gson.Gson; import org.slf4j.Logger; import org.slf4j.LoggerFactory;;import javax.servlet.http.HttpServletRequest; @Aspect //定義一個(gè)切面 @Configuration @Slf4j public class TraceAspect { // 定義切點(diǎn)Pointcut @Pointcut("execution(* com.gf.controller..*.*(..))") public void excudeService() { } @Autowired Tracer tracer; @Around("excudeService()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { RequestAttributes ra = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes sra = (ServletRequestAttributes) ra; HttpServletRequest request = sra.getRequest(); String url = request.getRequestURL().toString(); String method = request.getMethod(); String uri = request.getRequestURI(); String queryString = request.getQueryString(); log.info("請(qǐng)求開(kāi)始, 各個(gè)參數(shù), url: {}, method: {}, uri: {}, params: {}", url, method, uri, queryString); // result的值就是被攔截方法的返回值 Object result = pjp.proceed(); JSONObject dd = JSONObject.parseObject(JSON.toJSONString(result)); dd.put("traceId",tracer.currentSpan().context().traceIdString()); log.info("請(qǐng)求結(jié)束,controller的返回值是 {} - {}", tracer.currentSpan().toString(), dd.toJSONString()); return dd; } }
Spring Boot 中的分布式追蹤及使用
隨著互聯(lián)網(wǎng)應(yīng)用程序的復(fù)雜性不斷增加,分布式系統(tǒng)已經(jīng)成為了許多企業(yè)級(jí)應(yīng)用程序的標(biāo)配。在分布式系統(tǒng)中,由于服務(wù)之間的調(diào)用關(guān)系錯(cuò)綜復(fù)雜,很難追蹤到一個(gè)請(qǐng)求在整個(gè)系統(tǒng)中的執(zhí)行路徑和時(shí)間,這就給排查問(wèn)題和性能優(yōu)化帶來(lái)了巨大的挑戰(zhàn)。為了解決這個(gè)問(wèn)題,分布式追蹤技術(shù)應(yīng)運(yùn)而生。本文將介紹 Spring Boot 中的分布式追蹤技術(shù)及其使用方法。
分布式追蹤的概念
分布式追蹤(Distributed Tracing)是一種用于追蹤分布式系統(tǒng)中請(qǐng)求的執(zhí)行路徑和時(shí)間的技術(shù)。在分布式系統(tǒng)中,由于請(qǐng)求可能會(huì)經(jīng)過(guò)多個(gè)服務(wù)節(jié)點(diǎn),因此需要在請(qǐng)求流程中添加唯一的標(biāo)識(shí)符(Trace ID),并將 Trace ID 傳遞給所有相關(guān)的服務(wù)節(jié)點(diǎn)。每個(gè)服務(wù)節(jié)點(diǎn)在處理請(qǐng)求時(shí),都需要將 Trace ID 記錄在請(qǐng)求的上下文中,并將請(qǐng)求的上下文信息傳遞給下一個(gè)服務(wù)節(jié)點(diǎn)。這樣,就可以通過(guò) Trace ID 來(lái)追蹤一個(gè)請(qǐng)求在整個(gè)系統(tǒng)中的執(zhí)行路徑和時(shí)間。在追蹤過(guò)程中,還需要記錄每個(gè)服務(wù)節(jié)點(diǎn)處理請(qǐng)求的時(shí)間和耗時(shí),以便分析和優(yōu)化系統(tǒng)性能。
Spring Cloud Sleuth
Spring Cloud Sleuth 是 Spring Cloud 中的一個(gè)分布式追蹤框架,它提供了基于 Trace ID 的請(qǐng)求追蹤功能,可以協(xié)助開(kāi)發(fā)人員快速追蹤分布式系統(tǒng)中的請(qǐng)求執(zhí)行路徑和時(shí)間,并幫助排查問(wèn)題和優(yōu)化性能。
Spring Cloud Sleuth 使用 Zipkin 來(lái)存儲(chǔ)和展示分布式追蹤信息,Zipkin 是一個(gè)開(kāi)源的分布式追蹤系統(tǒng),可以用于存儲(chǔ)和展示分布式系統(tǒng)中的請(qǐng)求追蹤信息。
Spring Boot 中的分布式追蹤
Spring Boot 集成了 Spring Cloud Sleuth,可以非常方便地實(shí)現(xiàn)分布式追蹤功能。在 Spring Boot 應(yīng)用程序中,只需要添加以下依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
添加這些依賴后,Spring Boot 應(yīng)用程序就可以自動(dòng)配置分布式追蹤功能,并將追蹤信息發(fā)送到 Zipkin 服務(wù)器。
在應(yīng)用程序中,可以通過(guò) Tracer
接口來(lái)創(chuàng)建 Trace ID,并將 Trace ID 記錄在請(qǐng)求的上下文中:
@Autowired private Tracer tracer; @GetMapping("/hello") public String hello() { Span span = tracer.nextSpan().name("hello").start(); try (Tracer.SpanInScope ws = tracer.withSpan(span)) { // 處理請(qǐng)求 return "Hello World!"; } finally { span.finish(); } }
在每個(gè)服務(wù)節(jié)點(diǎn)中,都需要將 Trace ID 記錄在請(qǐng)求的上下文中,并將請(qǐng)求的上下文信息傳遞給下一個(gè)服務(wù)節(jié)點(diǎn)。Spring Boot 可以通過(guò) RestTemplate
和 Feign
來(lái)自動(dòng)傳遞請(qǐng)求的上下文信息,只需要在 RestTemplate
和 Feign
中添加相應(yīng)的配置即可:
@Bean public RestTemplate restTemplate() { return new RestTemplateBuilder() .interceptors(new TraceRestTemplateInterceptor(tracer())) .build(); } @Bean public Feign.Builder feignBuilder() { return Feign.builder().requestInterceptor(new TraceFeignRequestInterceptor(tracer())); }
Zipkin 的使用
Zipkin 是一個(gè)用于存儲(chǔ)和展示分布式追蹤信息的系統(tǒng),可以用于分析和優(yōu)化分布式系統(tǒng)的性能。在 Spring Boot 中,可以通過(guò)以下步驟來(lái)使用 Zipkin:
1.下載并啟動(dòng) Zipkin 服務(wù)器
可以從 Zipkin 的官網(wǎng)下載 Zipkin 服務(wù)器,并啟動(dòng) Zipkin 服務(wù)器。啟動(dòng) Zipkin 服務(wù)器后,可以在瀏覽器中訪問(wèn) http://localhost:9411
來(lái)查看 Zipkin 的 Web 界面。
2.配置 Spring Boot 應(yīng)用程序發(fā)送追蹤信息到 Zipkin 服務(wù)器
在 Spring Boot 應(yīng)用程序中,可以通過(guò)以下配置來(lái)將追蹤信息發(fā)送到 Zipkin 服務(wù)器:
spring: zipkin: base-url: http://localhost:9411
3.查看分布式追蹤信息
在啟動(dòng) Spring Boot 應(yīng)用程序后,可以通過(guò)訪問(wèn)應(yīng)用程序的端點(diǎn)來(lái)觸發(fā)請(qǐng)求,并在 Zipkin 的 Web 界面中查看分布式追蹤信息。在 Zipkin 的 Web 界面中,可以查看每個(gè)請(qǐng)求的 Trace ID、請(qǐng)求流程中的服務(wù)節(jié)點(diǎn)、服務(wù)節(jié)點(diǎn)的執(zhí)行時(shí)間和耗時(shí)等信息。
總結(jié)
分布式追蹤技術(shù)是解決分布式系統(tǒng)中請(qǐng)求執(zhí)行路徑和時(shí)間無(wú)法追蹤的問(wèn)題的關(guān)鍵技術(shù)之一。
Spring Boot 集成了 Spring Cloud Sleuth 和 Zipkin,使得分布式追蹤變得非常簡(jiǎn)單。
在 Spring Boot 應(yīng)用程序中,可以通過(guò)添加相應(yīng)的依賴和配置來(lái)實(shí)現(xiàn)分布式追蹤功能,并將追蹤信息發(fā)送到 Zipkin 服務(wù)器。
使用分布式追蹤技術(shù)可以幫助開(kāi)發(fā)人員更好地管理和監(jiān)控分布式系統(tǒng),并提高系統(tǒng)的可靠性和性能。
到此這篇關(guān)于Spring Boot 中的 Sleuth 簡(jiǎn)介及使用方法的文章就介紹到這了,更多相關(guān)Spring Boot Sleuth使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java通過(guò)CMD方式讀取注冊(cè)表任意鍵值對(duì)代碼實(shí)踐
這篇文章主要介紹了Java通過(guò)CMD方式讀取注冊(cè)表任意鍵值對(duì)代碼實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06IDEA導(dǎo)入Eclipse項(xiàng)目的方法步驟(圖文教程)
這篇文章主要介紹了IDEA導(dǎo)入Eclipse項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Spring?Boot循環(huán)依賴原理、解決方案與最佳實(shí)踐(全解析)
循環(huán)依賴指兩個(gè)或多個(gè)Bean相互直接或間接引用,形成閉環(huán)依賴關(guān)系,這篇文章主要介紹了Spring?Boot循環(huán)依賴原理、解決方案與最佳實(shí)踐(全解析),需要的朋友可以參考下2025-04-04Spring Boot 編寫Servlet、Filter、Listener、Interceptor的方法
這篇文章給大家介紹了spring-boot中如何定義過(guò)濾器、監(jiān)聽(tīng)器和攔截器,對(duì)Spring Boot 編寫Servlet、Filter、Listener、Interceptor的相關(guān)知識(shí)感興趣的朋友一起看看吧2017-07-07java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字
本文主要介紹了java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02解決ObjectMapper.convertValue() 遇到的一些問(wèn)題
這篇文章主要介紹了解決ObjectMapper.convertValue() 遇到的一些問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06