logback+MDC实现链路追踪

有什么用:

每一个前端请求下的所有的日志信息都有对应的一个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>

这样就结束了。有问题评论或私聊。


版权声明:本文为hk1052606583原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。