在开发过程中,日志对我们调试问题拥有非常大的帮助。OpenFeign 默认情况下不会输出详细的 HTTP 请求和响应日志,但我们可以通过创建 Spring Boot 配置类来实现这一点。
注意,每个创建的 Feign 客户端都会创建一个 logger。默认情况下,logger 的名字是用于创建 Feign 客户端的接口的全类名称。并且,Feign 的日志只响应 DEBUG 级别。
你可以为每个 Feign 客户端配置 Logger.Level 对象,告诉 Feign 日志级别。日志级别可选值如下:
Logger.Level.NONE 没日志(默认)。
Logger.Level.BASIC 只记录请求方法和URL以及响应状态代码和执行时间。
Logger.Level.HEADERS 记录基本信息以及请求和响应头。
Logger.Level.FULL 记录请求和响应的header、正文和元数据。
具体做法如下:
在 Spring Boot 项目中,可以通过 @Configuration 注解创建一个配置类,例如 FeignConfig 配置类,代码如下:
package com.hxstrive.demo_springcloud_openfeign.config; import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Feign 配置类 * @author hxstrive.com */ @Configuration public class FeignConfig { @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
上面配置类中定义了一个 feignLoggerLevel 方法,返回 Logger.Level.FULL,这将使 Feign 在调用时打印出完整的日志信息,包括请求和响应的详细内容,方便调试。你还可以通过这个配置类设置其他的属性,如连接超时时间和读取超时时间等。
OpenFeign 打印的完整详细日志的日志级别是 DEBUG,我们需要再 application.yml 配置文件中将我们定义的 Feign 客户端所在包的日志级别定义为 DEBUG 或者更低级别。
配置如下:
logging: level: root: info com.hxstrive.demo_springcloud_openfeign.feign: TRACE
上面配置中,假设我们创建的 Feign 客户端均位于 com.hxstrive.demo_springcloud_openfeign.feign 包下面,将该包的日志级别设置为 TRACE,比 DEBUG 日志级别更低。然后,重启服务,尝试调用远程服务,输出日志如下图:
如果按照上面的例子配置了 Feign 客户端日志,但是没有起到任何作用,你还可尝试:
@EnableFeignClients 注解有一个 defaultConfiguration 属性。如果你想让所有的 Feign 客户端都使用这个 FeignConfig 配置,可以这样使用:
@SpringBootApplication @EnableFeignClients(defaultConfiguration = FeignConfig.class) public class YourApplication { //... }
注意:只要 FeignConfig 位于 Spring Boot 的扫描路径下,是不需要手动设置的,Spring Boot 会自动帮我们匹配到的。
如果你只想让特定的 Feign 客户端应用这个配置,可以在 @FeignClient 注解中指定 configuration 属性。例如:
@FeignClient(value = "SERVICE-DEMO", configuration = FeignConfig.class) public interface SimpleFeign { @GetMapping("/simple/hello") String hello(); }
通常情况下,Spring Boot 会帮我们自动处理好,不需要手动设置。