下面就是 "springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码" 的详细攻略。
先了解基本概念
在介绍示例代码之前,先了解一下基本概念,有助于更好地理解实现过程:
- Dubbo:一种高性能、轻量级的远程服务框架,支持 RPC 协议和多种注册中心。
- TraceId:一条调用链路的唯一标识,常用于日志追踪,用于串联业务流程的各个步骤。
- MDC(Mapped Diagnostic Context):即映射线程诊断上下文,是用来存放诊断上下文信息的 Map,一般用于记录日志、监控等场景。
示例代码
示例一:设置TraceId(log4j2版本)
- 引入log4j2依赖包
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.13.0</version>
</dependency>
- 在log4j2.xml文件中加入%d{traceId},即可在日志中打印TraceId
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%t] %c:%L - %m%n{traceId}" />
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="ConsoleAppender" />
</Root>
</Loggers>
</Configuration>
- 在服务provider的DubboFilter类中创建TraceId,并放入MDC中
public class DubboFilter implements Filter {
private final static String traceIdKey = "traceId";
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
String traceId = UUID.randomUUID().toString();
MDC.put(traceIdKey, traceId);
try {
return invoker.invoke(invocation);
} finally {
MDC.remove(traceIdKey);
}
}
}
- 在服务consumer的DubboFilter类中获取TraceId,放入MDC中
public class DubboFilter implements Filter {
private final static String traceIdKey = "traceId";
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
String traceId = MDC.get(traceIdKey);
if (StringUtils.isBlank(traceId)) {
traceId = UUID.randomUUID().toString();
MDC.put(traceIdKey, traceId);
}
try {
return invoker.invoke(invocation);
} finally {
MDC.remove(traceIdKey);
}
}
}
示例二:设置TraceId(logback版本)
- 引入logback依赖包
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
- 在logback.xml文件中加入%X{traceId},即可在日志中打印TraceId
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss,SSS} %highlight(%-5level) %logger{15}.%M :%L - %msg%n%X{traceId}</pattern>
</encoder>
</appender>
<logger name="com.xxxx" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
- 在服务provider的DubboFilter类中创建TraceId,并放入MDC中
public class DubboFilter implements Filter {
private final static String traceIdKey = "traceId";
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
String traceId = UUID.randomUUID().toString();
MDC.put(traceIdKey, traceId);
try {
return invoker.invoke(invocation);
} finally {
MDC.remove(traceIdKey);
}
}
}
- 在服务consumer的DubboFilter类中获取TraceId,放入MDC中
public class DubboFilter implements Filter {
private final static String traceIdKey = "traceId";
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
String traceId = MDC.get(traceIdKey);
if (StringUtils.isBlank(traceId)) {
traceId = UUID.randomUUID().toString();
MDC.put(traceIdKey, traceId);
}
try {
return invoker.invoke(invocation);
} finally {
MDC.remove(traceIdKey);
}
}
}
总结
以上就是 "springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码" 的完整攻略。在Dubbo服务框架中,通过在服务提供者和消费者中增加一个DubboFilter来设置和获取TraceId,并在日志中打印,从而实现了服务调用的日志追踪和排查。关于TraceId的具体实现和在日志中打印的方法,可以根据实际情况进行调整和修改。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码 - Python技术站