前言
在工作中,在定位问题时经常需要查看每个接口的参数,虽然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));
}
}