好,欢迎大家继续关注我的博客,今天来给大家分享AOP的第二个实战案例,就是统一的日志输出。在开发的工作中,经常要求我们把一个请求的入参和请求时间打印出来,代码很简答 直接贴出来供大家参考
@Component
@Aspect
public class WebLogAspect {
private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
/**
* @Author Eric
* @Description 切所有的controller方法
* @Date 16:18 2019/1/29
* @Param [] //两个..代表所有子目录,最后括号里的两个..代表所有参数
* @return void
**/
@Pointcut("execution( * com.bxlsj..controller.*.*(..))")
public void logPointCut() {
}
@Before("logPointCut()")
public void doBefore(JoinPoint joinPoint) {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
logger.info("请求地址 : " + request.getRequestURL().toString());
logger.info("HTTP METHOD : " + request.getMethod());
// 获取真实的ip地址
logger.info("IP : " + IPUtils.getIpAddr(request));
logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "."
+ joinPoint.getSignature().getName());
logger.info("参数 : " + Arrays.toString(joinPoint.getArgs()));
// loggger.info("参数 : " + joinPoint.getArgs());
}
/** returning的值和doAfterReturning的参数名一致 */
@AfterReturning(returning = "ret", pointcut = "logPointCut()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容(返回值太复杂时,打印的是物理存储空间的地址)
logger.debug("返回值 : " + ret);
}
@Around("logPointCut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
long startTime = System.currentTimeMillis();
// ob 为方法的返回值
Object ob = pjp.proceed();
logger.info("耗时 : " + (System.currentTimeMillis() - startTime));
return ob;
}
}