SpringBoot项目利用Aop切面拦截来记录日志

1、pom.xml文件中添加依赖

 <!--aop-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2、创建LoggerAspect.java文件

@Aspect
@Component
public class LoggerAspect {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Pointcut("execution(* com.example.test_example.controller.*.*(..))")
    public void log() {}

    @Before("log()")
    public void doBefore(JoinPoint joinPoint) {
        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attr.getRequest();
        String url = request.getRequestURL().toString();
        String ip = request.getRemoteAddr();
        String classMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        ReturnLogger returnLogger = new ReturnLogger(url, ip, classMethod, args);
        logger.info("Request = {}", returnLogger);
    }

    @After("log()")
    public void doAfter() {
        //可自行设定
        logger.info("**************** doAfter ****************");
    }

    @AfterReturning(returning = "result", pointcut = "log()")
    public void resultData(Object result) {
        //返回请求访问方法的返回值
        logger.info("Result: {}", result);
    }

    /**
     * @Description     将访问者的信息写入日志的载体类
     */
    private class ReturnLogger {

        private String url;
        private String ip;
        private String classMethod;
        private Object[] args;

        public ReturnLogger(String url, String ip, String classMethod, Object[] args) {
            this.url = url;
            this.ip = ip;
            this.classMethod = classMethod;
            this.args = args;
        }

        @Override
        public String toString() {
            return "ReturnLogger{" +
                    "url='" + url + '\'' +
                    ", ip='" + ip + '\'' +
                    ", classMethod='" + classMethod + '\'' +
                    ", args=" + Arrays.toString(args) +
                    '}';
        }
    }
}

(1)@Aspect 是标识一个类以供切面容器读取。
(2)@Pointcut(“execution(* com.example.test_example.controller..(…))”) 表示com.example.test_example.controller路径下的任何类任何方法被访问都将触发被@Pointcut 标示的方法相关的一系列事件,但是被标示的方法本身不会被执行,它仅仅是被声明的一个入口。
(3)@Before(“log()”) 表示在log()方法执行之前先执行被其标示的方法。
(4)@After(“log()”) 表示在log()方法执行结束后再执行被其标示的方法。
(5)@AfterReturning(returning = “result”, pointcut = “log()”) 表示被请求访问的方法访问结束后再执行被其标示的方法。

3、在浏览器中输入访问地址,日志显示结果如下:
在这里插入图片描述

你可能感兴趣的:(SpringBoot项目利用Aop切面拦截来记录日志)