OpenFeign日志打印功能

本文介绍了如何在Spring Cloud中配置Feign的日志级别,通过创建`FeignConfig`类并设置`Logger.Level.FULL`来实现详细日志输出。在`application.yml`中针对`PaymentFeignService`接口设置了日志级别为`debug`,展示了日志打印的效果,包括请求和响应的详细信息。
  1. 建一个FeignConfig,如下:

    @Configuration
    public class FeignConfig {
    
        @Bean
        Logger.Level feignLoggerLevel() {
            // 日志级别:NONE、BASIC、HEADERS、FULL
            return Logger.Level.FULL;
        }
    
    }
    
  2. 在application.yml配置文件中添加如下配置:

    logging:
      level:
      	# feign日志以什么级别监控哪个接口
        com.athailin.springcloud.service.PaymentFeignService: debug
    
  3. 日志打印效果:

    2021-08-19 10:40:45.490 DEBUG 50600 --- [p-nio-80-exec-2] c.a.s.service.PaymentFeignService        : [PaymentFeignService#getPaymentById] ---> GET http://CLOUD-PAYMENT-SERVICE/payment/get/1 HTTP/1.1
    2021-08-19 10:40:45.490 DEBUG 50600 --- [p-nio-80-exec-2] c.a.s.service.PaymentFeignService        : [PaymentFeignService#getPaymentById] ---> END HTTP (0-byte body)
    2021-08-19 10:40:45.499 DEBUG 50600 --- [p-nio-80-exec-2] c.a.s.service.PaymentFeignService        : [PaymentFeignService#getPaymentById] <--- HTTP/1.1 200 (8ms)
    2021-08-19 10:40:45.499 DEBUG 50600 --- [p-nio-80-exec-2] c.a.s.service.PaymentFeignService        : [PaymentFeignService#getPaymentById] connection: keep-alive
    2021-08-19 10:40:45.499 DEBUG 50600 --- [p-nio-80-exec-2] c.a.s.service.PaymentFeignService        : [PaymentFeignService#getPaymentById] content-type: application/json
    2021-08-19 10:40:45.500 DEBUG 50600 --- [p-nio-80-exec-2] c.a.s.service.PaymentFeignService        : [PaymentFeignService#getPaymentById] date: Thu, 19 Aug 2021 02:40:45 GMT
    2021-08-19 10:40:45.500 DEBUG 50600 --- [p-nio-80-exec-2] c.a.s.service.PaymentFeignService        : [PaymentFeignService#getPaymentById] keep-alive: timeout=60
    2021-08-19 10:40:45.500 DEBUG 50600 --- [p-nio-80-exec-2] c.a.s.service.PaymentFeignService        : [PaymentFeignService#getPaymentById] transfer-encoding: chunked
    2021-08-19 10:40:45.500 DEBUG 50600 --- [p-nio-80-exec-2] c.a.s.service.PaymentFeignService        : [PaymentFeignService#getPaymentById] 
    2021-08-19 10:40:45.500 DEBUG 50600 --- [p-nio-80-exec-2] c.a.s.service.PaymentFeignService        : [PaymentFeignService#getPaymentById] {"code":200,"message":"查询成功!serverPort:8001","data":{"id":1,"serial":"aaabb01"}}
    2021-08-19 10:40:45.500 DEBUG 50600 --- [p-nio-80-exec-2] c.a.s.service.PaymentFeignService        : [PaymentFeignService#getPaymentById] <--- END HTTP (90-byte body)
    
### 通过 @FeignClient 注解实现微服务调用日志打印的最佳实践 在微服务架构中,使用 OpenFeign 进行服务间调用时,日志记录是非常重要的。以下是实现调用日志打印的最佳实践。 #### 1. 配置 Feign 的日志级别 Feign 提供了内置的日志功能,可以通过配置日志级别来控制输出的详细程度。在 `application.yml` 或 `application.properties` 文件中添加以下配置: ```yaml feign: client: config: default: # 默认配置适用于所有 Feign 客户端 loggerLevel: FULL # 日志级别设置为 FULL ``` 日志级别有以下几种: - **NONE**:不记录任何日志(默认值)。 - **BASIC**:仅记录请求方法和 URL,以及响应状态码和执行时间。 - **HEADERS**:记录基本日志信息以及请求和响应的头信息。 - **FULL**:记录所有请求和响应的详细信息,包括头信息、正文和元数据[^1]。 #### 2. 自定义 Feign 日志记录器 如果需要更灵活的日志记录方式,可以自定义 Feign 的 `Logger`。创建一个自定义的 `Logger` 类,并将其注入到 Feign 客户端中。 ```java import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FeignConfig { @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; // 设置日志级别为 FULL } } ``` #### 3. 使用 FallbackFactory 实现异常处理并记录日志 当 Feign 调用失败时,使用 `FallbackFactory` 不仅可以提供兜底返回值,还可以记录详细的异常信息。这有助于排查问题并优化日志记录[^3]。 ```java import feign.hystrix.FallbackFactory; import org.springframework.stereotype.Component; @Component public class ServiceProviderFallbackFactory implements FallbackFactory<ServiceProviderFeignClient> { @Override public ServiceProviderFeignClient create(Throwable cause) { return new ServiceProviderFeignClient() { @Override public String getService() { // 记录异常日志 System.err.println("Feign 调用失败,原因:" + cause.getMessage()); return "Fallback Response"; // 返回兜底值 } }; } } ``` 在 `@FeignClient` 注解中指定 `fallbackFactory` 属性: ```java @FeignClient(name = "service-provider", fallbackFactory = ServiceProviderFallbackFactory.class) public interface ServiceProviderFeignClient { @RequestMapping(value = "/api/service", method = RequestMethod.GET) String getService(); } ``` #### 4. 结合 AOP 切面增强日志功能 如果需要对所有 Feign 调用进行统一的日志记录,可以使用 Spring AOP 编写切面。通过拦截 Feign 客户端的方法调用,记录请求和响应的详细信息。 ```java import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Aspect @Component public class FeignLoggingAspect { private static final Logger logger = LoggerFactory.getLogger(FeignLoggingAspect.class); @Around("execution(* com.example.feignclients.*.*(..))") public Object logFeignCalls(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); try { Object result = joinPoint.proceed(); long elapsedTime = System.currentTimeMillis() - start; logger.info("Feign 调用成功:{},耗时:{} ms", joinPoint.getSignature().toShortString(), elapsedTime); return result; } catch (Throwable ex) { long elapsedTime = System.currentTimeMillis() - start; logger.error("Feign 调用失败:{},耗时:{} ms,原因:{}", joinPoint.getSignature().toShortString(), elapsedTime, ex.getMessage()); throw ex; } } } ``` #### 5. 配置 Sleuth 或 Zipkin 进行分布式追踪 对于复杂的微服务系统,建议集成 Spring Cloud Sleuth 或 Zipkin 等分布式追踪工具。这些工具可以自动记录服务调用链路,并将日志与追踪信息关联起来,便于分析和排查问题[^4]。 --- ### 示例代码 以下是一个完整的 Feign 客户端示例,结合了日志配置和异常处理: ```java @FeignClient(name = "userservice", fallbackFactory = UserClientFallbackFactory.class) public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); } @Component public class UserClientFallbackFactory implements FallbackFactory<UserClient> { @Override public UserClient create(Throwable cause) { return new UserClient() { @Override public User findById(Long id) { System.err.println("用户服务调用失败,原因:" + cause.getMessage()); return new User(id, "Fallback User", "N/A"); } }; } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值