增加依赖
视状况增加spring-boot-starter-aop依赖。
配置AOP切面
罕用注解作用:
@Aspect:申明该类为一个注解类;
@Pointcut:定义一个切点,前面追随一个表达式,表达式能够定义为某个 package 下的办法,也能够是自定义注解等;
切点定义好后,就是围绕这个切点做文章了:
@Before: 在切点之前,织入相干代码;
@After: 在切点之后,织入相干代码;
@AfterReturning: 在切点返回内容后,织入相干代码,个别用于对返回值做些加工解决的场景;
@AfterThrowing: 用来解决当织入的代码抛出异样后的逻辑解决;
@Around: 在切入点前后织入代码,并且能够自在的管制何时执行切点;
package com.guomz.demo.aspect;import com.guomz.demo.util.JSONUtil;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;/** * 输入每个申请响应的日志 */@Component@Aspect@Slf4jpublic class WebLogAspect { @Pointcut("execution(public * com.guomz.demo.controller..*.*(..))") public void webLog(){ } /** * 在切点之前织入 * @param joinPoint * @throws Throwable */ @Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Throwable { // 开始打印申请日志 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 打印申请相干参数 log.info("========================================== Start =========================================="); // 打印申请 url log.info("URL : {}", request.getRequestURL().toString()); // 打印 Http method log.info("HTTP Method : {}", request.getMethod()); // 打印调用 controller 的全门路以及执行办法 log.info("Class Method : {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName()); // 打印申请的 IP log.info("IP : {}", request.getRemoteAddr()); // 打印申请入参 log.info("Request Args : {}", JSONUtil.toJson(joinPoint.getArgs())); } /** * 在切点之后织入 * @throws Throwable */ @After("webLog()") public void doAfter() throws Throwable { log.info("=========================================== End ==========================================="); // 每个申请之间空一行 log.info(""); } /** * 盘绕 * @param proceedingJoinPoint * @return * @throws Throwable */ @Around("webLog()") public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { long startTime = System.currentTimeMillis(); Object result = proceedingJoinPoint.proceed(); // 打印出参 log.info("Response Args : {}", JSONUtil.toJson(result)); // 执行耗时 log.info("Time-Consuming : {} ms", System.currentTimeMillis() - startTime); return result; }}
在切点注解中对controller包下的全副办法进行了植入,JSONUtil为本人实现的json序列化工具。
本文援用自:
Spring Boot AOP 切面对立打印申请与响应日志