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())); } } } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!