有什么用:
每一个前端请求下的所有的日志信息都有对应的一个TraceId,这个id会在我们服务器日志里,把他串联起来,方便查看程序运行,执行了什么操作,以及方便问题排查。
怎么用:
1.先引入lombok依赖,因为用到了slf4j中的MDC
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
创建一个TraceId放到MDC变量中
可以用雪花算法生成,我使用的是mybatis-plus中带的雪花算法,大家可以按照自己的想法生成一个唯一值。
public class GetIdUtil{
public static long generate() {
long id = IdWorker.getId();
return id;
}
}
使用AOP实现
//此为spring aop知识,不懂的自己去了解
@Pointcut("execution(public * com.example.test..*.*(..))")
public void logPoincut() {
}
// 配置class的环绕通知,使用在方法aspect()上注册的切入点
@Around(value = "logPoincut()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
// 生成一个链路ID
long traceId = GetIdUtil.generate();
// 放置此ID入MDC
MDC.put("traceId",traceId);
//实际业务
Object resultObj = joinPoint.proceed();
try {
chain.doFilter(request,response);
} finally {
MDC.clear();//must be,threadLocal
}
return resultObj;
}
配置logback的pattern来进行输出
注意:此处的traceId跟MDC.put中的keyyo对应上,这会打印到控制台。
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%d{ISO8601}][%-5level]%X{traceId}[%t][%C]%X{fromServiceName} - %msg%n</pattern>
</encoder>
</appender>
这样就结束了。有问题评论或私聊。