MDC
MDC Mapped Diagnostic Contexts
是一个诊断的工具类。支持logback
log4j
,提供的方法很简单,get put remove clear,这些方法针是针对线程的上下文的操作,其实MDC的实现也比较简单,核心是对ThreadLocal
的一个子类InheritableThreadLocal
的操作,这样保证了该类的子类共享该类的上下文
dubbo filter
dubbo filter 可以为dubbo服务传递上下文,这样结合MDC就可以用来分析dubbo服务上下文之间的调用,特别在并发量大的时候能够很清晰的grep出来同一个请求的上下文,让定位问题更简单
例子
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread][%X{trace_id}] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
注意%X{trace_id}
记录了trace_id
的变量值
关于logback其他参数
%msg
就是单纯的日志内容
%n
换行
%-5level
左对齐 最短长度5 日志等级
打印日志也是对性能有一定的影响的,打印的内容需要注意下
dubbo filter
public class TraceFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
// trace_id 可以从请求参数中获取
MDC.put("trace_id", UUID.randomUUID().toString());
return invoker.invoke(invocation);
}
}
在请求开始时记录下来 trace_id
,也可以在请求头中加入trace相关信息,这样在分布式系统中就可以将日志信息串联起来