使用过滤器对dubbo请求时参数返回值等做日志记录
新增过滤器
过滤器需要实现org.apache.dubbo.rpc.Filter
// 可以使用注解也可以使用xml格式配置
@Activate
public class DubboServiceLogFilter implements Filter {
private final static String msg = ">>>>>线程ID:{%s}\r\n>>>>>请求参数:{%s}\r\n>>>>>请求方法:{%s}\r\n>>>>>请求时长:{%s毫秒},请求结果:{%s}";
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
// 方法开始执行的时间
long startTime = System.currentTimeMillis();
// 全部请求参数
Object[] objects = invocation.getArguments();
// 请求参数
Object[] paramObjects = null;
if (objects != null && objects.length > 0) {
//这里可以进行参数筛选
paramObjects = new Object[objects.length];
// 其他参数赋值到paramObjects
System.arraycopy(objects, 0, paramObjects, 0, paramObjects.length);
}
String classMethod = invoker.getInterface() + "." + invocation.getMethodName();
// 返回结果
Result result = null;
// 线程ID
Long threadId = Thread.currentThread().getId();
// 方法结束执行的时间
long endTime;
try {
result = invoker.invoke(invocation);
} catch (Exception e) {
endTime = System.currentTimeMillis();
System.out.println(String.format(msg, threadId, JSONObject.toJSON(paramObjects), classMethod, endTime - startTime, "请求异常,异常明细如下:"));
e.printStackTrace();
throw e;
}
endTime = System.currentTimeMillis();
System.out.println((String.format(msg, threadId, JSONObject.toJSON(paramObjects), classMethod, endTime - startTime, result.getValue())));
return result;
}
}
或者采用xml配置,比如只对消费者生效。
<dubo:provider filter="DubboServiceLogFilter"/>
xml和注解二选一即可。
配置过滤器
1、在resources目录下新建META-INF/dubbo目录,若存在多环境切换,则可以配置在对应环境下(例:resources/test/META-INF/dubbo)
2、在该目录下文件名为 org.apache.dubbo.rpc.Filter 的文件
3、在文本内配置DubboServiceLogFilter=包路径.DubboServiceLogFilter(例如: com.****.filter.DubboServiceLogFilter)
之所以配置到META-INF/dubbo/ 这个目录,可以查询ExtensionLoader类
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示