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 18654141915@163.com
*/
@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.成功日志记录界面