本文主要讲述了springcloud微服务使用Feign作为微服务间的通讯框架的情况下,如何配置统一的日志打印,能更直观地在日志中收集有效信息。 (以下只提供了核心代码截图,详细代码可通过github、gitee仓库查看,文末附代码目录)一、单体服务请求响应日志收集 1。利用Filter打印请求日志 2。利用ResponseBodyAdvice打印响应日志 3。使用postman请求API 【日志打印效果】(因为log。info是在chain。doFilter之后执行的,所以这里请求日志在后)22:58:23。365〔16582427033635607〕〔httpnio6001exec3〕INFOLogResponseBodyAdvice。beforeBodyWrite〔32〕{code:0,message:成功,data:2022071922:58:23}22:58:23。368〔16582427033635607〕〔httpnio6001exec3〕INFORequestFilter。doFilterInternal〔52〕GET192。168。31。158apitimeheader:{xplatform:app},param:{a:1},body:{b:bb},4ms 可支持各种请求数据打印(包括请求头、url参数、bodyform参数、bodyraw参数、响应数据)二、微服务请求响应日志收集(基于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〕〔hystrixtemplateuser10〕INFOFeignIPClient。execute〔42〕13msGEThttp:192。168。31。158:8002usergetById?id123:33:50。370〔16582448303481157〕〔httpnio6001exec3〕INFOFeignCostTimeAspect。feignCostTime〔30〕requestfeign:UserFeign。getById,mills:19,args:〔1〕,result:{code:0,message:成功,data:{id:1,name:adasd,status:2,statusDesc:冻结}}23:33:50。373〔16582448303481157〕〔httpnio6001exec3〕INFOLogResponseBodyAdvice。beforeBodyWrite〔32〕{code:0,message:成功,data:{id:1,name:adasd,status:2,statusDesc:冻结}}23:33:50。377〔16582448303481157〕〔httpnio6001exec3〕INFORequestFilter。doFilterInternal〔52〕GET192。168。31。158apigetUserByIdheader:{xplatform:app},param:{id:1},body:{},29ms 【user服务的日志】23:33:50。363〔16582448303481157〕〔httpnio8002exec3〕INFOLogResponseBodyAdvice。beforeBodyWrite〔32〕{code:0,message:成功,data:{id:1,name:adasd,status:2,statusDesc:冻结}}23:33:50。366〔16582448303481157〕〔httpnio8002exec3〕INFORequestFilter。doFilterInternal〔52〕GET192。168。31。158usergetByIdheader:{xplatform:app},param:{id:1},body:{},6ms 【日志说明】 FeignIPClient。execute 》所在的日志行打印的是目标主机的IP端口 FeignCostTimeAspect。feignCostTime 》所在的日志行打印的是Feign的请求参数和响应结果 header:{xplatform:app} 》就是利用RequestInterceptor传递的请求头 怎么样?如果你觉得有用的话,还不快快搞起!!! 附:涉及的代码目录 github:https:github。com897665787springcloudtemplate GitHub897665787springcloudtemplate gitee:https:gitee。comjqdispringcloudtemplate springcloudtemplate:一个基于springcloudnetflix微服务框架,记录了关于微服务开发的一些最佳应用,欢迎大家学习指导。springcloudtemplatetemplateframeworkadviceLogResponseBodyAdvice响应ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a统一打印aspectFeignCostTimeAspect记录请求Feign接口耗时,打印在调用方ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志aFeignIPClient打印feign请求目标机器信息autoconfigureLoadBalancerFeignClientAutoConfigurationFeignIPClient的自动配置filterRequestFilter请求参数ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a打印interceptorFeignHeaderInterceptorFeign调用过程中传递header值