springboot实现打印每个接口请求的出参和入参
前言
在工作中,在定位问题时经常需要查看每个接口的参数,虽然DEBUG也是个很好的方式,但是这种方式仅限于在本地开发过程中使用,在生产环境中大多数问题的定位都只能通过日志来解决,所以打印参数就显得尤为重要,以下方式使用spring 的 面向切面AOP实现在调用接口前和调用接口后打印出参和入参,只需要一个类既可,代码如下:
package com.bizzan.bitrade.aspect;import com.alibaba.fastjson.JSONObject;
import io.netty.util.internal.ObjectUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;@Aspect
@Component
@Slf4j
public class LogAspect {@Pointcut("execution(public * com.bizzan.bitrade.controller.*.*(..))")public void requestAspect(){}@Before(value = "requestAspect()")public void methodBefore(JoinPoint joinPoint){ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = requestAttributes.getRequest();//打印请求内容log.info("请求地址:{},请求方式:{},请求类方法:{},请求类方法参数:{}" ,request.getRequestURL().toString(),request.getMethod(),joinPoint.getSignature(), Arrays.toString(joinPoint.getArgs()));}//在方法执行完结后打印返回内容@AfterReturning(returning = "o",pointcut = "requestAspect()")public void methodAfterReturing(Object o ){log.info("返回数据:{}" , JSONObject.toJSONString(o));}
}