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

  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级别打印)