Dubbo 分布式 日志 追踪

使用dubbo分布式框架进行微服务的开发,一个大系统每每会被拆分红不少不一样的子系统,而且子系统还会部署多台机器,当其中一个系统出问题了,查看日志十分麻烦。php

因此须要一个固定的流程ID和机器ip地址等来把全部的日志进行染色处理,固然能够经过调用其余接口时参数进行传递,可是这样子对代码的耦合性太强,对代码有侵入性。apache

咱们能够经过dubbo的filter 结合slf4j的MDC或者log4j2的ThreadContext的进行参数的注入,能够直接在日志文件中配置被注入的参数,这样就对系统和日志id打印进行了解耦。服务器

其中当用logback日志的时候是须要调用MDC的方法,而log4j2则须要调用ThreadContext的方法。session

 

下面的例子是使用slf4j的日志模式:多线程

 

1.上游系统调用下游系统和下游系统接收上游系统定义两个filter框架

ProviderRpcTraceFilterdom

import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;

/**
 * 日志染色
 * @author phpdragon
 */
@Activate(group = {Constants.PROVIDER},order = 1)
public class ProviderRpcTraceFilter extends Filter {

    /**
     * 
     * @param invoker
     * @param invocation
     * @return
     * @throws RpcException
     */
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String traceId = RpcContext.getContext().getAttachment("trace_id");
        if (StringUtils.isBlank(traceId)) {
            traceId = this.getUUID() ;
        }

        //设置日志traceId变量
        MDC.put("traceId", traceId);

        RpcContext.getContext().setAttachment("trace_id", traceId);

        try{
            return invoker.invoke(invocation);
        }finally {
            MDC.remove("traceId");
        }
    }

    /**
     * 获取UUID
     * @return String UUID
     */
    public String getUUID(){
        String uuid = UUID.randomUUID().toString();
        //替换-字符
        return uuid.replaceAll("-", "");
    }

}

ConsumerRpcTraceFilter分布式

import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;

/**
 * 日志染色ProviderRpcTraceFilter
 * @author phpdragon
 */
@Activate(group = {Constants.CONSUMER})
public class ConsumerRpcTraceFilter extends Filter {

    /**
     * 
     * @param invoker
     * @param invocation
     * @return
     * @throws RpcException
     */
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String traceId = MDC.get("traceId");
        if (StringUtils.isBlank(traceId)) {
            traceId = this.getUUID() ;
        }

        RpcContext.getContext().setAttachment("trace_id", traceId);
     return invoker.invoke(invocation);
    }

    /**
     * 获取UUID
     * @return String UUID
     */
    public String getUUID(){
        String uuid = UUID.randomUUID().toString();
        //替换-字符
        return uuid.replaceAll("-", "");
    }

}

 

2.下游系统被调用的时候能够经过dubbo中RpcContext.getAttachment()方法来获取上游系统传递下来的值ide

String traceId = RpcContext.getContext().getAttachment("trace_id");

 

3.使用MDC来设置日志变量 %X{traceId}微服务

MDC.put("traceId", traceId);

 

4.在方法调用完成后移除该ID

try{
    return invoker.invoke(invocation);
}finally {
    MDC.remove("traceId");
}

 

5.当上游系统调用下游系统的时候,能够经过dubbo中RpcContext.setAttachment()方法进行参数传递

RpcContext.getContext().setAttachment("trace_id", traceId);

 

6.而后在/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter (或者 com.apache.dubbo.rpc.Filter ) 文件中配置filter

providerRpcTraceFilter=com.xxx.xxx.filter.ProviderRpcTraceFilter
consumerRpcTraceFilter=com.xxx.xxx.filter.ConsumerRpcTraceFilter

 

7.若是要打印服务器ip,使用com.alibaba.dubbo.common.utils.NetUtils工具获取ip,而后put到MDC里面

String serverIp = NetUtils.getLocalHost()
MDC.put("serverId", serverIp);

 

8.设置logback.xml 的日志输出格式

%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%X{serverId}] [%X{sessionId}] -%5p ${PID:-} [%15.15t] %-40.40logger{39} : %m%n

 

9.最后经过Kibana对日志进行收集归总,使用trace_id筛选,快速定位到错误位置。

 

注意:

1. dubbo应用同时担任provider、consumer时,RpcTraceFilter 不能合并成一个类,必须分开。

2.多线程的状况下,会取不到这个ID,须要作处理,好比将建立线程的时候将id经过参数传入(见:Dubbo分布式日志追踪,多线程不能获取窜ID和IP问题

 

PS:

https://blog.csdn.net/qq_20641565/article/details/78627202

https://blog.csdn.net/qq_20641565/article/details/78628115

https://www.jianshu.com/p/3dca4aeb6edd

https://blog.csdn.net/weixin_39178876/article/details/85088410

https://blog.csdn.net/xiaolyuh123/article/details/80560662

相关文章
相关标签/搜索