Spring Cloud Sleuth的MDC集成实现自定义跟踪

2023-04-12 07:32:00 浏览数 (1)

Spring Cloud Sleuth是一个基于Spring Cloud的分布式跟踪解决方案。它使用了Google Dapper的思想,通过在服务调用链路上添加唯一的traceId和spanId来追踪请求的流转情况。而MDC(Mapped Diagnostic Context)则是log4j和logback等日志框架中的一个功能,它可以在日志输出时动态添加一些关键信息,便于问题的定位和排查。

MDC的基本用法

在介绍如何使用Spring Cloud Sleuth的MDC集成之前,我们先来了解一下MDC的基本用法。MDC是一种将上下文信息与线程绑定的机制。在Java中,可以通过ThreadLocal实现MDC。在log4j和logback等日志框架中,可以通过MDC来记录上下文信息,例如traceId、spanId等。下面是一个简单的例子:

代码语言:javascript复制
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class MdcExample {
    private static final Logger logger = LoggerFactory.getLogger(MdcExample.class);

    public static void main(String[] args) {
        MDC.put("traceId", "123456");
        logger.info("Hello, world!");
        MDC.clear();
    }
}

在上面的例子中,我们使用MDC.put方法将traceId设置为"123456",然后使用logger.info方法输出日志,最后使用MDC.clear方法清空MDC。在输出的日志中,我们可以看到traceId的值已经被动态添加了进去。

Spring Cloud Sleuth的MDC集成

Spring Cloud Sleuth的MDC集成,可以将traceId和spanId等信息自动添加到MDC中,从而实现自定义跟踪。默认情况下,Spring Cloud Sleuth会将traceId和spanId分别命名为"traceId"和"spanId",并添加到MDC中。我们可以通过配置来修改这些默认值。下面是一个简单的配置示例:

代码语言:javascript复制
spring:
  sleuth:
    mdc:
      keys: traceId, spanId, foo

在上面的配置中,我们将默认的"traceId"和"spanId"改为了自定义的值,并添加了一个名为"foo"的自定义字段。这些字段将被自动添加到MDC中,从而方便我们在日志中查看。

除了配置之外,我们还需要在代码中手动添加一些MDC的信息。可以使用Spring Cloud Sleuth提供的Tracer接口来获取traceId和spanId等信息,然后将它们添加到MDC中。下面是一个简单的示例:

代码语言:javascript复制
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;

@Component
public class MyService {
    private static final Logger logger = LoggerFactory.getLogger(MyService.class);

    @Autowired
    private Tracer tracer;

    public void doSomething() {
        String traceId = tracer.currentSpan().traceIdString();
        String spanId = tracer.currentSpan().spanIdString();
        MDC.put("traceId", traceId);
        MDC.put("spanId", spanId);
        MDC.put("foo", "bar");
        logger.info("Hello, world!");
        MDC.clear();
    }
}

在上面的示例中,我们使用@Autowired注解注入了Tracer接口,然后在doSomething方法中获取了当前的traceId和spanId,并将它们添加到MDC中。同时,我们还添加了一个名为"foo",值为"bar"的自定义字段。最后,在输出日志之后,我们清空了MDC。

0 人点赞