dubbo源码阅读之-重新ExceptionFilterProxy增加异常入参打印

复制代码
package com.biz.core.armslog;

import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerAdapter;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.alibaba.dubbo.common.logger.jcl.JclLoggerAdapter;
import com.alibaba.dubbo.common.logger.jdk.JdkLoggerAdapter;
import com.alibaba.dubbo.common.logger.log4j.Log4jLoggerAdapter;
import com.alibaba.dubbo.common.logger.slf4j.Slf4jLoggerAdapter;
import com.alibaba.dubbo.common.utils.ConfigUtils;
import com.alibaba.dubbo.rpc.*;
import com.alibaba.dubbo.rpc.filter.ExceptionFilter;
import com.alibaba.dubbo.rpc.service.GenericService;
import com.alibaba.fastjson.JSON;

import java.io.Serializable;

/**
 * @author liqiang
 * @date 2020/4/2 14:23
 * @Description: (what)通过dubboSPI机制对Filter进行代理在原有功能的基础上做增强(打印错误入参) 需要移除默认的exceptionFilter
 * <dubbo:provider filter="-exception,exceptionFilterProxy" />
 * (why) 增强provider异常过滤器 打印异常入参
 */
@Activate(
        group = {"provider"}//限制provider可用
)
public class ExceptionFilterProxy implements Filter {
    private final Logger logger;
    Filter filter;

    public ExceptionFilterProxy() {
        this.logger = LoggerFactory.getLogger(ExceptionFilterProxy.class);
        //静态代理ExceptionFilter
        this.filter = new ExceptionFilter();
    }

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        Result result = filter.invoke(invoker, invocation);
        //对ExceptionFilter做功能增强 当出现异常打印入参
        if (filter instanceof ExceptionFilter) {
            outputLog(result, invoker, invocation);
        }
        return result;
    }

    public void outputLog(Result result, Invoker<?> invoker, Invocation invocation) {
        try {
            if (result.hasException() && GenericService.class != invoker.getInterface()) {
                Throwable exception = result.getException();
                if (exception instanceof RuntimeException) {
                    logger.error(buildLog(invocation.getParameterTypes(), invocation.getArguments()));
                }
            }
        } catch (Exception e) {
            logger.error("打印异常入参出错", e);
        }
    }

    private String buildLog(Class<?>[] parametersTypes, Object[] parameterValues) {
        if (parametersTypes == null || parametersTypes.length <= 0) {
            return null;
        }
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("入参:\n");
        for (int i = 0; i < parametersTypes.length; i++) {
            Class<?> type = parametersTypes[i];
            Object value = parameterValues[i];
            if (Serializable.class.isAssignableFrom(type)) {
                stringBuilder.append(String.format("参数类型:%s,参数值:%s\n", type.toString(), value != null ? JSON.toJSONString(value) : null));
            } else {
                stringBuilder.append(String.format("参数类型:%s,参数值:%s\n", type.toString(), value != null ? value.toString() : null));
            }
        }
        return stringBuilder.toString();

    }

    static {
        String logger = "slf4j";
        if ("slf4j".equals(logger)) {
            LoggerFactory.setLoggerAdapter((LoggerAdapter) (new Slf4jLoggerAdapter()));
        } else if ("jcl".equals(logger)) {
            LoggerFactory.setLoggerAdapter((LoggerAdapter) (new JclLoggerAdapter()));
        } else if ("log4j".equals(logger)) {
            LoggerFactory.setLoggerAdapter((LoggerAdapter) (new Log4jLoggerAdapter()));
        } else if ("jdk".equals(logger)) {
            LoggerFactory.setLoggerAdapter((LoggerAdapter) (new JdkLoggerAdapter()));
        } else {
            try {
                LoggerFactory.setLoggerAdapter((LoggerAdapter) (new Log4jLoggerAdapter()));
            } catch (Throwable var6) {
                try {
                    LoggerFactory.setLoggerAdapter((LoggerAdapter) (new Slf4jLoggerAdapter()));
                } catch (Throwable var5) {
                    try {
                        LoggerFactory.setLoggerAdapter((LoggerAdapter) (new JclLoggerAdapter()));
                    } catch (Throwable var4) {
                        LoggerFactory.setLoggerAdapter((LoggerAdapter) (new JdkLoggerAdapter()));
                    }
                }
            }
        }

    }
}
复制代码

 

posted @   意犹未尽  阅读(83)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示