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。