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;
}