spring boot Aop日志记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Z__Sheng/article/details/81062026

spring boot Aop日志记录

Aop 面向切面编程。让业务逻辑代码和关注点分离,我们只用关注切点就好,对本身写的业务逻辑代码没有影响。

首先,我们用图片解释一下什么叫做切面,如下图:
假设我们有一个立体正方形,图中,贯穿了三条线,但是不影响原来的代码逻辑。对原来的正方形是没有影响的,动态切入进去的。这就是切面

Aop表达式 详解

在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut”切入点”

例如定义切入点表达式execution(* com.sunyard.monitorControl.controller...(..))

execution()是最常用的切点函数,其语法如下所示:

整个表达式可以分为五个部分:

1、execution(): 表达式主体。

2、第一个号:表示返回类型,号表示所有的类型。

3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sun.controller包、子孙包下所有类的方法。

4、第二个号:表示类名,号表示所有的类。

5、(..):最后这个星号表示方法名,号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。

——–接下来我们开始写spring boot Aop日志记录

1.首先 我们在启动类里面 加上
//开启切面
@EnableAspectJAutoProxy

2.maven项目,引入依赖

<dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.10</version>
        </dependency>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

3.写一个 切面日志类,其中 切点 自己定义自己的项目。这样,当我们在访问每一个接口的时候,都会在控制台打印如下信息。如果想要打印异常到日志文件中,可以自己配置

package com.sunyard.monitorControl.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;


/**
 * @author Mr sheng.z
 * @email [email protected]
 */
@Component
@Aspect
public class WebLoggger {

    private static final Logger logger = LoggerFactory.getLogger(WebLoggger.class);


    @Pointcut("execution(* com.sunyard.monitorControl.controller..*.*(..))")
    public void webLog() {
    }


    @Before("webLog()")
    public void doBefore() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        logger.info("URL:" + request.getRequestURL().toString());
    }


    @After("webLog()")
    public void doAfter(JoinPoint joinPoint) {
        String name = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        logger.info("切点:" + joinPoint);
        logger.info("类名:" + name);
        logger.info("方法名:" + methodName);
        logger.info("目标方法内的参数为:" + Arrays.asList(joinPoint.getArgs()));

    }

    @AfterReturning("webLog()")
    public void doAfterReturning() {
        logger.info("方法执行成功");
    }
}

4.成功日志记录界面
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Z__Sheng/article/details/81062026