微服务分布式架构中,如何高效收集请求/响应日志

本文主要讲述了spring cloud微服务使用Feign作为微服务间的通讯框架的情况下,如何配置统一的日志打印,能更直观地在日志中收集有效信息。
(以下只提供了核心代码截图,详细代码可通过github、gitee仓库查看, 文末附代码目录)

一、单体服务请求/响应日志收集

1.利用Filter打印请求日志

2.利用ResponseBodyAdvice打印响应日志

3.使用postman请求API

【日志打印效果】( 因为log.info是在chain.doFilter之后执行的,所以这里请求日志在后
22:58:23.365 [16582427033635607] [http-nio-6001-exec-3]  INFO LogResponseBodyAdvice.beforeBodyWrite[32] - {"code":0,"message":"成功","data":"2022-07-19 22:58:23"}
22:58:23.368 [16582427033635607] [http-nio-6001-exec-3]  INFO RequestFilter.doFilterInternal[52] - GET 192.168.31.158 /api/time header:{"x-platform":"app"},param:{"a":"1"},body:{"b":"bb"},4ms
可支持各种请求数据打印(包括请求头、url参数、body form参数、body raw参数、响应数据)

二、微服务请求/响应日志收集(基于Feign)

Feign是一个基于http封装的通讯框架,但因为调用方式的不同,所以在日志的搜集上需要做些额外的操作补充一下日志
比如当前服务调用user服务的某个Feign接口,user服务集群部署在3台机器上,我想快速知道当前服务调用的下一个节点是那台机器

1.自定义一个FeignIPClient继承Client.Default,重写execute方法,增加1个日志的打印

同时我还想知道当前服务调用Feign的请求参数和响应结果

2.增加1个FeignClient注解的切面,因为Feign的调用就相当于是方法的调用,可以利用AOP的方式来做增强

同时我还希望Feign调用过程中,可以把当前服务的请求头的内容传递给下一个服务(比如一些公共的请求头,用户ID,链路追踪日志ID等)

3.利用Feign提供的拦截器RequestInterceptor,在Feign请求发起前往RequestTemplate设置header就OK了

【当前服务的日志】
​23:33:50.365 [16582448303481157] [hystrix-template-user-10]  INFO FeignIPClient.execute[42] - 13ms GET http://192.168.31.158:8002/user/getById?id=1
23:33:50.370 [16582448303481157] [http-nio-6001-exec-3]  INFO FeignCostTimeAspect.feignCostTime[30] - request feign:UserFeign.getById,mills:19,args:[1],result:{"code":0,"message":"成功","data":{"id":1,"name":"adasd","status":2,"statusDesc":"冻结"}}
23:33:50.373 [16582448303481157] [http-nio-6001-exec-3]  INFO LogResponseBodyAdvice.beforeBodyWrite[32] - {"code":0,"message":"成功","data":{"id":1,"name":"adasd","status":2,"statusDesc":"冻结"}}
23:33:50.377 [16582448303481157] [http-nio-6001-exec-3]  INFO RequestFilter.doFilterInternal[52] - GET 192.168.31.158 /api/getUserById header:{"x-platform":"app"},param:{"id":"1"},body:{},29ms
【user服务的日志】
23:33:50.363 [16582448303481157] [http-nio-8002-exec-3]  INFO LogResponseBodyAdvice.beforeBodyWrite[32] - {"code":0,"message":"成功","data":{"id":1,"name":"adasd","status":2,"statusDesc":"冻结"}}
23:33:50.366 [16582448303481157] [http-nio-8002-exec-3]  INFO RequestFilter.doFilterInternal[52] - GET 192.168.31.158 /user/getById header:{"x-platform":"app"},param:{"id":"1"},body:{},6ms
【日志说明】
FeignIPClient.execute
》所在的日志行打印的是目标主机的IP+端口
FeignCostTimeAspect.feignCostTime
》所在的日志行打印的是Feign的请求参数和响应结果
header:{"x-platform":"app"}
》就是利用RequestInterceptor传递的请求头
怎么样?如果你觉得有用的话,还不快快搞起!!!
附:涉及的代码目录
github:https://github.com/897665787/springcloud-template
springcloud-template
└── template-framework
     └── advice
          └── LogResponseBodyAdvice -- 响应日志统一打印
     └── aspect
          └── FeignCostTimeAspect -- 记录请求Feign接口耗时,打印在调用方日志
          └── FeignIPClient -- 打印feign请求目标机器信息
     └── autoconfigure
          └── LoadBalancerFeignClientAutoConfiguration -- FeignIPClient的自动配置
     └── filter
          └── RequestFilter -- 请求参数日志打印
     └── interceptor
          └── FeignHeaderInterceptor -- Feign调用过程中传递header值

猜你喜欢

转载自blog.csdn.net/w13528476101/article/details/125947312