背景
原服务日志打印格式不统一、出入口日志不规范,导致无法快速定位问题,无法精细化监控或统计异常;
controller日志接口通过切面获取到IP、请求URL、入参、出参以及耗时;
但切面无法获取到FeignClient接口的请求对象和请求URL,排查问题时不方便
openFeign原生日志,请求和返回值是分离的,不符合我的需求,所以决定自定义feign日志
经过了各种尝试,最终使用feign原生日志钩子,选择用FeignLoggerFactory 和 feign.Logger 来实现自定义feignClient日志;
有其他更好的方案,欢迎评论区留言讨论~~
原理
openfeign初始化FeignClient时,会先用获取FeignLoggerFactory实例并创建Logger实例;
FeignLoggerFactory是个接口,我们可以利用这个钩子创建自己Factory类并创建自定义的Logger实例,
以此来达到自定义feignClient日志的目的
public class FeignClientFactoryBean implements FactoryBean<Object>, InitializingBean, ApplicationContextAware, BeanFactoryAware {
protected Builder feign(FeignClientFactory context) {
FeignLoggerFactory loggerFactory = (FeignLoggerFactory)this.get(context, FeignLoggerFactory.class);
Logger logger = loggerFactory.create(this.type);
Builder builder = ((Builder)this.get(context, Builder.class)).logger(logger).encoder((Encoder)this.get(context, Encoder.class)).decoder((Decoder)this.get(context, Decoder.class)).contract((Contract)this.get(context, Contract.class));
this.configureFeign(context, builder);
return builder;
}
}
实现
import feign.Logger;
import org.springframework.cloud.openfeign.FeignLoggerFactory;
import org.springframework.context.annotation.Bean;
import