美文网首页Java服务端面试技术干货
利用MDC + dubbo filter记录dubbo日志

利用MDC + dubbo filter记录dubbo日志

作者: shiy4n | 来源:发表于2018-05-01 23:29 被阅读910次

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相关信息,这样在分布式系统中就可以将日志信息串联起来

利用MDC + dubbo filter记录dubbo日志

相关文章

网友评论

    本文标题:利用MDC + dubbo filter记录dubbo日志

    本文链接:https://www.haomeiwen.com/subject/dmtqrftx.html