-
背景
由于feign,默认只有debug的level,才能打印出日志。不太符合一般项目的log info level的约定。因此决定自定义feign的log打印。
-
目的
在info level下,可以打印feign日志
-
寻找线索
- 打开openfeign的核心包目录寻找log相关类
-
通过
feign-2.pngFeignLoggerfactory
的注释,可以看出此,接口是用来应用定制logger的接口
-
此factory有一个default类
feign-3.pngDefaultFeignLoggerFactory
,可以根据这个类找到实际的打印类
-
可以坐在
feign-4.pngSlf4jLogger
中发现,Feign只有在debug日志级别下才能打印的原因
-
开始编写
-
步骤大概
- 自定义实现
FeignLoggerfactory
此接口 - 模仿
DefaultFeignLoggerFactory
- 模仿
Slf4jLogger
- 配置注入,并使其生效
- 自定义实现
-
自定义实现
FeignLoggerfactory
此接口public class InfoFeignLoggerFactory implements FeignLoggerFactory { @Override public Logger create(Class<?> type) { return new InfoFeignLogger(LoggerFactory.getLogger(type)); } }
-
模仿
Slf4jLogger
,public class InfoFeignLogger extends Logger { private final org.slf4j.Logger logger; public InfoFeignLogger(org.slf4j.Logger logger) { this.logger = logger; } @Override protected void log(String configKey, String format, Object... args) { // info级别 if (logger.isInfoEnabled()) { this.logger.info(String.format(methodTag(configKey) + format, args)); } } @Override protected void logRequest(String configKey, Level logLevel, Request request) { // info级别 if (this.logger.isInfoEnabled()) { super.logRequest(configKey, logLevel, request); } } @Override protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime) throws IOException { // info级别 return this.logger.isInfoEnabled() ? super.logAndRebufferResponse(configKey, logLevel, response, elapsedTime) : response; } }
-
注入配置
@Configuration public class FeignConfig { @Bean Logger.Level feignLevel() { return Logger.Level.FULL; } @Bean FeignLoggerFactory infoFeignLoggerFactory() { return new InfoFeignLoggerFactory(); } }
-
让custom的factory生效。找到
feign-5.pngFeignClientsConfiguration
类
-
通过条件装配,当应用缺`FeignLoggerfactory`的实现的时候,才会加载default。因此我们自己编写的自定义factory会生效。
- 实现上述步骤,即可在info级别下,打印出日志
作者:鱼da王
链接:https://www.jianshu.com/p/615f23eba760
来源:简书
标签:info,Feign,自定义,feign,configKey,logger,Logger From: https://www.cnblogs.com/xd502djj/p/18135547