这篇文章主要介绍了Feign logging 开启调用日志及原理分析,如果帮助到了大家,希望用你毛茸茸的小手点个赞🤗;如有错误或未考虑完全的地方,希望在评论区留言🫡
Spring Cloud OpenFeign官方文档提供了解决方案
一. Feign logging开启调用日志
- 配置类
@Configuration
public class FeignLogConfig {
@Bean
public Logger.Level feignLogLevel(){
/**
* 日志级别:
* NONE(不记录日志 (默认))
* BASIC(只记录请求方法和URL以及响应状态代码和执行时间)
* HEADERS(记录请求和应答的头的基本信息)
* FULL(记录请求和响应的头信息,正文和元数据)
*/
return Logger.Level.FULL;
}
}
- yml配置文件(请求feign包下的所有feignClent时,都会打印日志)
com.itjcloud.resource.api为feignClent所在的包路径,这样配置可以达到请求此包下的所有feignClent时,都会打印日志
logging:
# 声明指定的feign service 服务的日志级别为debug,可以打印出服务调用的详情
level:
com:
itjcloud:
resource:
api: DEBUG
- yml配置文件(请求feign包下特定feignClent时,才会打印日志)
BannerFeignClient 为com.itjcloud.resource.api包下的其中一个feignClent,这样配置可以达到请求BannerFeignClient时,才会打印日志
logging:
# 声明指定的feign service 服务的日志级别为debug,可以打印出服务调用的详情
level:
com:
itjcloud:
resource:
api:
BannerFeignClient: DEBUG
二. 调用服务,测试打印日志信息
BASIC级别日志
HEADERS级别日志
FULL级别日志
三. 原理分析
1.FeignLogConfig设置的Logger.Level是如何生效的
1.1 查看feign调用源码发现,SynchronousMethodHandler.invoke()中如果Logger.Level不是NONE级别,则会打印日志
1.2 继续跟进去发现,如果日志级别大于等于HEADERS,则输出请求头,如果级别大于等于FULL,则输出请求体
1.3 当设置日志级别为FULL时,responseBody是如何打印的呢
- 为何在yml中设置logging.level为deug
通过上边源码发现,打印日志最终会调到Logger.log(),feign logger实现类Slf4jLogger在调用log方法时,会判断是否开启了debug