AOP切面日志切Feign时,无法接受到返回参数

1. 说明

在使用OpenFegn Client作为地方接口调用工具时,会对接口调用输入输出情况做日志记录。使用Feign本身的几个日志级别时输出日志会呈现很多堆栈信息如下配置,不便于ELK之类工具搜集排查问题。这里我们使用AOP切面日志。

  • Fei日志级别
/*打印feign请求日志级别*/
  @Bean
  public Logger.Level level() {
      return Logger.Level.FULL;
  }

2、切面日志相关配置

  • AOP切面配置
@Slf4j
@Aspect
@Component
public class LoggerAspect {

    @Pointcut("execution(public * com.esb.client.*.*(..))")
    public void feignCut() {
    }

  // === Feign 切面日志 ===
  @Around("feignCut()")
  public void around(ProceedingJoinPoint joinPoint) throws Throwable{
      final Long startTime = System.currentTimeMillis();
      log.info("Feign调用方法:{}, 请求参数:{}", getUrl(joinPoint),JSON.toJSONString(joinPoint.getArgs()));
      Object responseData = joinPoint.proceed();
      log.info("Feign接口耗时:{}ms,Feign返回数据:{}",System.currentTimeMillis()-startTime,JSON.toJSONString(responseData));
  }
}
  • Feign接口
@FeignClient(name = "esb-service", url = "${esb.url}", configuration = FeignClientConfig.class)
public interface EsbFeignClient {

   @GetMapping(value = "/common-terminus/mc/default/querymcuserprofile")
    ESBBaseResponse<UserInfoRespDto> getUserInfoBySid(@RequestParam(value = "sid") String sid, @RequestParam(value = "appId") String appId,
                                                      @RequestParam(value = "openId") String openId, @RequestParam(value = "shopId") String shopId,
                                                      @RequestParam(value = "shopType") Integer shopType);
}
  • 调用地方
ESBBaseResponse<UserInfoRespDto> baseResponse = feignClient.getUserInfoBySid(sid, appId, openId, shopId, shopType);
  • 调试发现返回对象参数未null

3、解决方式

当我们把切面日志改为@Before @After时,可以正常接收返回参数。
在使用@Around时候需要 : return Object

 @Around("feignCut()")
 public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
        final Long startTime = System.currentTimeMillis();
        log.info("Feign调用方法:{}, 请求参数:{}", getUrl(joinPoint),JSON.toJSONString(joinPoint.getArgs()));
        Object responseData = joinPoint.proceed();
        log.info("Feign接口耗时:{}ms,Feign返回数据:{}",System.currentTimeMillis()-startTime,JSON.toJSONString(responseData));
        return responseData;
}
posted @ 2021-08-27 10:40  Geroge1226  阅读(879)  评论(0)    收藏  举报