一、單體項(xiàng)目
1.直接使用springboot自帶日志框架
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
2.定義日志攔截器
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;
public class OcrLogInterceptor implements HandlerInterceptor {
private static final String TRACE_ID = "TRACE_ID";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String tid = UUID.randomUUID().toString().replaceAll("-", "");
if (StringUtils.isNotBlank(request.getHeader(TRACE_ID))) {
tid = request.getHeader(TRACE_ID);
}
MDC.put(TRACE_ID, tid);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
MDC.remove(TRACE_ID);
}
}
3.將定義的日志攔截器配置到WebMvcConfigurer中,并且指定攔截請求的規(guī)則
import demo.RequestInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 攔截WEB請求
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new RequestInterceptor());
}
}
4.配置 Logback
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %X{traceId}%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
在這個(gè)配置文件中,我們定義了一個(gè)控制臺輸出的 appender,并使用 %X{traceId} 來輸出 MDC 中的 traceId。
參考:https://www.cnblogs.com/jingzh/p/17248886.html
二、分布式項(xiàng)目
在Spring Cloud中,可以使用Spring Cloud Sleuth來實(shí)現(xiàn)分布式追蹤。
在pom.xml文件中添加Spring Cloud Sleuth依賴,例如:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
2、配置日志。
在application.properties(或application.yml)文件中,添加以下配置:
spring.sleuth.sampler.probability: 1.0
這將啟用Sleuth并設(shè)置采樣率為100%。
3、 打印日志。
在需要追蹤的代碼中添加日志輸出,例如:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestController
public class TestController {
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
@GetMapping("/hello")
public String hello() {
logger.info("Hello, Sleuth!");
return "Hello, Sleuth!";
}
}
4、運(yùn)行應(yīng)用程序。
啟動應(yīng)用程序并觀察日志輸出。Sleuth將為每個(gè)請求生成一個(gè)唯一的跟蹤ID和跟蹤標(biāo)簽,以便跟蹤請求的路徑。
- 查看追蹤信息。
可以使用Zipkin等分布式追蹤系統(tǒng)來查看和分析生成的追蹤信息。通過配置Sleuth將追蹤信息發(fā)送到Zipkin服務(wù)器。
這些是使用Spring Cloud Sleuth進(jìn)行分布式追蹤的基本步驟。您還可以配置更多的參數(shù)來自定義和優(yōu)化追蹤行為。有關(guān)更多詳細(xì)信息,請參閱Spring Cloud Sleuth的官方文檔。