美文网首页
Feign日志 - 自定义 info级别打印

Feign日志 - 自定义 info级别打印

作者: 鱼da王 | 来源:发表于2019-12-05 17:50 被阅读0次
    1. 背景

      由于feign,默认只有debug的level,才能打印出日志。不太符合一般项目的log info level的约定。因此决定自定义feign的log打印。

    2. 目的

      在info level下,可以打印feign日志

    3. 寻找线索

      • 打开openfeign的核心包目录寻找log相关类
      feign-1.png
    • 通过FeignLoggerfactory的注释,可以看出此,接口是用来应用定制logger的接口

      feign-2.png
    • 此factory有一个default类DefaultFeignLoggerFactory,可以根据这个类找到实际的打印类

      feign-3.png
    • 可以坐在Slf4jLogger中发现,Feign只有在debug日志级别下才能打印的原因

      feign-4.png
    1. 开始编写

      • 步骤大概

        • 自定义实现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生效。找到FeignClientsConfiguration

        feign-5.png
     通过条件装配,当应用缺`FeignLoggerfactory`的实现的时候,才会加载default。因此我们自己编写的自定义factory会生效。
    
    1. 实现上述步骤,即可在info级别下,打印出日志

    相关文章

      网友评论

          本文标题:Feign日志 - 自定义 info级别打印

          本文链接:https://www.haomeiwen.com/subject/ikkjgctx.html