dubbo-自定義日誌攔截器

背景

目前的項目,遠程服務調用所有都是基於dubbo,有的是部門內部互相調用,有的是調用其餘部門的服務。因爲業務裏面涉及到遠程調用服務的地方比較多,目前調用每一個服務的時候都要手動寫打印入參、響應和異常,比較麻煩。html

如今對這塊進行優化,目的是實現自動打印入參、響應和異常,從而避免每一個服務都要手動寫重複的代碼。spring

實現

1.實現過濾器

新建包apache

XXX.solid.filter //以filter結尾json

新建類-自定義服務消費者日誌攔截器springboot

package XXX.solid.filter;

import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.*;
import com.alibaba.dubbo.rpc.service.GenericService;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

/**
 * 服務消費者日誌攔截器,做用是打印dubbo調用的入參和響應
 * @author gongzhihao
 */
@Slf4j
@Activate(group = {Constants.CONSUMER})
public class LogDubboConsumerFilter implements Filter {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        //打印入參
        log.info("dubbo入參,InterfaceName={},MethodName={},Parameter={}", invocation.getInvoker().getInterface().getName(), invocation.getMethodName(), invocation.getArguments());
        //開始時間
        long startTime = System.currentTimeMillis();
        //執行接口調用邏輯
        Result result = invoker.invoke(invocation);
        //調用耗時
        long elapsed = System.currentTimeMillis() - startTime;
        //若是發生異常,則打印異常日誌
        if (result.hasException() && invoker.getInterface() != GenericService.class) {
//            log.error("dubbo執行異常: ", result.getException());
            log.error("dubbo執行異常!!!");
        } else {
            log.info("dubbo響應,InterfaceName={},MethodName={},Resposne={},SpendTime={} ms", invocation.getInvoker().getInterface().getName(), invocation.getMethodName(), JSON.toJSONString(new Object[]{result.getValue()}), elapsed);
        }
        //返回結果響應數據
        return result;

    }
}

新建類-自定義服務提供者日誌攔截器app

package XXX.solid.filter;

import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.*;
import com.alibaba.dubbo.rpc.service.GenericService;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

/**
 * 服務提供者日誌攔截器,做用是打印dubbo調用的入參和響應
 * @author gongzhihao
 */
@Slf4j
@Activate(group = { Constants.PROVIDER })
public class LogDubboProviderFilter implements Filter {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        //打印入參
        log.info("dubbo入參,InterfaceName={},MethodName={},Parameter={}", invocation.getInvoker().getInterface().getName(), invocation.getMethodName(), invocation.getArguments());
        //開始時間
        long startTime = System.currentTimeMillis();
        //執行接口調用邏輯
        Result result = invoker.invoke(invocation);
        //調用耗時
        long elapsed = System.currentTimeMillis() - startTime;
        //若是發生異常,則打印異常日誌
        if (result.hasException() && invoker.getInterface() != GenericService.class) {
//            log.error("dubbo響應,dubbo執行異常: ", result.getException());
            log.error("dubbo執行異常!!!");
        } else {
            log.info("dubbo響應,InterfaceName={},MethodName={},Response={},SpendTime={} ms", invocation.getInvoker().getInterface().getName(), invocation.getMethodName(), JSON.toJSONString(new Object[]{result.getValue()}), elapsed);
        }
        //返回結果響應數據
        return result;

    }
}

2.配置

新建目錄和文件:META-INF/dubbo/org.apache.dubbo.rpc.Filteride

添加配置內容:優化

logDubboProviderFilter=XXX.solid.filter.LogDubboProviderFilter
logDubboConsumerFilter=XXX.solid.filter.LogDubboConsumerFilter

注:若是不生效,配置如下內容日誌

1.springboot項目code

application.properties

dubbo.provider.filter=logDubboProviderFilter
dubbo.consumer.filter=logDubboConsumerFilter

2.spring項目

<dubbo:provider filter="logDubboProviderFilter"/>

<dubbo:consumer retries="0" timeout="60000" loadbalance="roundrobin" actives="0"

validation="false" filter="logDubboConsumerFilter"/>

關閉dubbo自帶的日誌攔截器

自帶的accesslog配置,只打印入參,且只在服務提供者打印入參。

若是有accesslog配置,則去掉,避免打印重複日誌。

異常

1.dubbo有自帶的異常攔截器,使用默認的自帶的異常攔截器便可,不作改動。

2.若是須要在異常日誌裏打印特殊信息(好比,定位是哪一筆訂單異常),也能夠捕獲異常,而且打印日誌。

參考

http://dubbo.apache.org/zh-cn...

相關文章
相關標籤/搜索