通过AOP实现日志输出

通过AOP实现日志输出

在我们接触一个新的项目时候,往往不知道前端哪个按钮对应后端的哪个url,这样怎么办,接下来就可以用到了日志,使用日志功能实现快速定位到mapping。

使用AOP思想添加环绕增强型日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.jia.mall.order.common.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
* 日志切面
* @author Jiazhibo
*/
@Aspect
@Component
@Slf4j
public class RequestLogAspect {
//拦截web下所有方法
@Around("execution(* com.jia.mall.*.controller.*.*(..))")
public Object logPointcut(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
String methodName = proceedingJoinPoint.getSignature().getName();
String classPath = proceedingJoinPoint.getSignature().getDeclaringTypeName();
long statrTime = System.currentTimeMillis();
Object[] args = proceedingJoinPoint.getArgs();
if (args != null && args.length > 0) {
log.info("\r\n请求方法:{}.{}(..)\r\n请求参数:{}", classPath, methodName, args[0]);
} else {
log.info("\r\n请求方法:{}.{}(..)", classPath, methodName);
}
Object result = proceedingJoinPoint.proceed();
long endTime = System.currentTimeMillis();
log.info("\r\n请求方法:{}.{}(..)\r\n响应参数:{}\r\n响应时间:{}ms", classPath, methodName, result, endTime - statrTime);
return result;
}
}

mybatis-plus添加sql语句输出

1
2
3
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

效果:

image

AOP注解

1、@Aspect

  • 名称:@Aspect

  • 类型:注解

  • 位置:类定义上方

  • 作用:设置当前类为切面类

  • 格式:

    1
    2
    3
    @Aspect  
    public class AopAdvice {
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    


* **说明:一个beans标签中可以配置多个aop:config标签**


### 2、@Pointcut

* 名称:@Pointcut

* 类型:**注解**

* 位置:方法定义上方

* 作用:使用当前方法名作为切入点引用名称

* 格式:

```java
@Pointcut("execution(\* \*(..))")
public void pt() {
}

  • 说明:被修饰的方法忽略其业务功能,格式设定为无参无返回值的方法,方法体内空实现(非抽象)

3、@Before

  • 名称:@Before

  • 类型:注解

  • 位置:方法定义上方

  • 作用:标注当前方法作为前置通知

  • 格式:

    1
    2
    3
    @Before("pt()")  
    public void before(){
    }
  • 特殊参数:

4、@After

  • 名称:@After

  • 类型:注解

  • 位置:方法定义上方

  • 作用:标注当前方法作为后置通知

  • 格式:

    1
    2
    3
    @After("pt()")  
    public void after(){
    }
  • 特殊参数:

5、@AfterReturning

  • 名称:@AfterReturning

  • 类型:注解

  • 位置:方法定义上方

  • 作用:标注当前方法作为返回后通知

  • 格式:

    1
    2
    3
    @AfterReturning(value="pt()",returning = "ret")  
    public void afterReturning(Object ret) {
    }
  • 特殊参数:

    • returning :设定使用通知方法参数接收返回值的变量名

6、@AfterThrowing

  • 名称:@AfterThrowing

  • 类型:注解

  • 位置:方法定义上方

  • 作用:标注当前方法作为异常后通知

  • 格式:

    1
    2
    3
    @AfterThrowing(value="pt()",throwing = "t")  
    public void afterThrowing(Throwable t){
    }
  • 特殊参数:

    • throwing :设定使用通知方法参数接收原始方法中抛出的异常对象名

7、@Around

  • 名称:@Around

  • 类型:注解

  • 位置:方法定义上方

  • 作用:标注当前方法作为环绕通知

  • 格式:

    1
    2
    3
    4
    5
    @Around("pt()")  
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
    Object ret = pjp.proceed();
    return ret;
    }
  • 特殊参数: