1.注解 LogTrace
package com.bt.springboot.common.annotation;
import java.lang.annotation.*;
/**
* 链路追踪
*
* @author
*/
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogTrace {
}
2.切面 LogTraceAspect
package com.bt.springboot.common.aspect;
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.slf4j.MDC;
import org.springframework.stereotype.Component;
import java.util.UUID;
/**
* 链路追踪
*
* @author
*/
@Aspect
@Component
@Slf4j
public class LogTraceAspect {
/**
* 与 logback-spring.xml 中的变量一致
*/
private static final String TRACE_ID = "traceId";
/**
* 定义切点 切点为
*/
@Pointcut("@within(com.bt.springboot.common.annotation.LogTrace)")
public void printLog(){
}
/**
* 环绕通知
*/
@Around(value = "printLog()")
public Object webLogAround(ProceedingJoinPoint joinPoint) throws Throwable {
// 方法执行前加上链路号
String traceId = UUID.randomUUID().toString().replaceAll("-", "");
MDC.put(TRACE_ID, traceId);
Object proceed = joinPoint.proceed();
MDC.remove(TRACE_ID);
return proceed;
}
}
3.添加依赖
<!-- 链路追踪 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.0.1</version>
</dependency>
4.修改logback-spring.xml
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--
<encoder>:对日志进行格式化。
<target>:字符串System.out(默认)或者System.err
-->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%-5level] %logger{50} - %msg%n</pattern>
</layout>
</encoder>
</appender>
5.测试 在类或方法上加上注解@LogTrace
package com.bt.springboot.web.controller;
import com.bt.springboot.common.annotation.LogTrace;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* @author zkx
* @Date 2022/4/8 11:36
*/
@LogTrace
@Slf4j
@RestController
public class TestController {
@GetMapping("/test")
public void test(){
log.info("info");
}
}
发送请求 日志可查看到traceId