FeignClient打印请求响应日志

默认情况FeignClient请求日志是不打印出来的,如果需要打印则需配置feign.client.config.default.logger-level,或者指定clientfeign.client.config.contenxtId.logger-level;

一、配置示例
# feign相关配置
feign:
  client:
    # 配置
    config:
      # feign.Request.Options.Options()
      default:
        # 控制日志Level,默认:null即NONE
        # NONE 没有日志
        # BASIC 只记录请求方法和URL以及响应状态码和执行时间
        # HEADERS 记录基本信息以及请求和响应头
        # FULL 记录请求和响应的头、正文和元数据
        logger-level: FULL
二、org.springframework.cloud.openfeign.FeignClientFactoryBean#feign方法
	protected Feign.Builder feign(FeignContext context) {
		FeignLoggerFactory loggerFactory = get(context, FeignLoggerFactory.class);
		Logger logger = loggerFactory.create(type);

		// @formatter:off
		Feign.Builder builder = get(context, Feign.Builder.class)
				// required values
				.logger(logger)
				.encoder(get(context, Encoder.class))
				.decoder(get(context, Decoder.class))
				.contract(get(context, Contract.class));
		// @formatter:on

		configureFeign(context, builder);
		applyBuildCustomizers(context, builder);

		return builder;
	}

此方法会根据FeignClient的配置创建logger对象,如果配置存在则会创建,则日志会打印到控制台上

三、日志如何打印到自定义的日志系统

日志打印到控制台可能不是我们想要的,需要打印到我们自定义的日志系统,这样方便我们查看定位问题;

首先我们自定义一个feign.Logger对象替换掉系统创建的对象:

    /**
     * 自定义日志系统代理feign日志系统
     */
    @Bean
    @Primary
    public Logger logger() {
        return new FeignLogger();
    }

FeignLogger类:

public class FeignLogger extends Logger {
    /**
     * 记录Feign调试日志
     *
     * @param configKey FeignClient 类名#方法名
     * @param format 日志格式化字符串 如:%s%s
     * @param args 格式化参数
     */
    @Override
    protected void log(String configKey, String format, Object... args) {
        LoggerUtils.info(FeignLogger.class, String.format(methodTag(configKey) + format, args));
    }
}

这样我们就可以将feign的请求响应日志记录到日志文件之中了,perfect!但此时你可能有一个疑问自定义的Logger是如何替换掉系统自己创建的Logger对象的;看下二中说的loggerFactory.create(type)方法:

public class DefaultFeignLoggerFactory implements FeignLoggerFactory {

	private Logger logger;

	public DefaultFeignLoggerFactory(Logger logger) {
		this.logger = logger;
	}

	@Override
	public Logger create(Class<?> type) {
    //如果logger对象已存在则使用存在的logger对象
		return this.logger != null ? this.logger : new Slf4jLogger(type);
	}

}

看看上述方法的逻辑如果logger对象已存在则使用存在的logger对象,很巧妙的解决了替换的问题;

GitHub地址:https://github.com/mingyang66/spring-parent

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页