美文网首页
SpringBoot项目使用aop输出日志

SpringBoot项目使用aop输出日志

作者: _灯火阑珊处 | 来源:发表于2019-12-16 14:38 被阅读0次

AOP的5种通知方式:

  1. @Before - 前置通知:在方法调用之前执行
  2. @After - 后置通知:在方法调用之后执行
  3. @Around - 环绕通知:在方法调用之前和之后,都分别可以执行通知
  4. @AfterThrowing - 异常通知:如果在方法调用过程中发生异常,则通知
  5. @AfterReturning- 最终通知:在方法调用之后执行
/**
 * AOP通知
 * 1:前置通知:在方法调用之前执行
 * 2:后置通知:在方法调用之后执行
 * 3:环绕通知:在方法调用之前和之后,都分别可以执行通知
 * 4:异常通知:如果在方法调用过程中发生异常,则通知
 * 5:最终通知:在方法调用之后执行
 */
@Aspect
@Component
public class ServiceLogAspect {

    public static final Logger log = LoggerFactory.getLogger(ServiceLogAspect.class);

    /**
     * 3000毫秒,3秒
     */
    private static final long THREE_SECONDS = 3000;
    /**
     * 2000毫秒,2秒
     */
    private static final long TWO_SECONDS = 2000;

    /**
     * 切面表达式
     * execution 代表所要执行的表达式主体
     * 第一处 * 代表方法返回类型,* 代表所有类型
     * 第二处 包名代表aop监控的类所在的包
     * 第三处 .. 代表该包以及其子包下的所有类方法
     * 第四处 * 代表类名,*代表所有类
     * 第五处 .*(..) *代表类中的方法名,(..)表示方法中的任何参数
     */
    @Around("execution(* com.test.service.impl..*.*(..))")
    public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("====== 开始执行 {}.{} ======",
                joinPoint.getTarget().getClass(),
                joinPoint.getSignature().getName());
        // 记录开始时间
        long begin = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        // 记录结束时间
        long end = System.currentTimeMillis();
        long takeTime = end - begin;
        if (takeTime > THREE_SECONDS) {
            // 执行时间大于3秒的
            log.error("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
        } else if (takeTime > TWO_SECONDS) {
            // 执行时间大于2秒的
            log.warn("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
        } else {
            log.info("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
        }
        return result;
    }

}
@Around("execution(* com.test.service.impl...(..))")

切面表达式:

  • execution 代表所要执行的表达式主体
  • 第一处 * 代表方法返回类型,* 代表所有类型
  • 第二处 包名代表aop监控的类所在的包
  • 第三处 .. 代表该包以及其子包下的所有类方法
  • 第四处 * 代表类名,*代表所有类
  • 第五处 *(..) *代表类中的方法名,(..)表示方法中的任何参数

相关文章