通过aop监控接口执行时间

  • 添加maven依赖
        <!--spring boot 对aop支持-->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-aop</artifactId>
       </dependency>
  • 创建切面类
package com.sun.foodie.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * @author 孙硕
 * @Date: 2021/1/22 19:47
 */
@Aspect
@Component
public class InterfaceLogAspect {

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

    /**
     * 环绕通知 监控接口执行时间
     * ***切入点表达式的格式:
     * 	execution([修饰符] 返回值类型 包名.类名.方法名(参数))
     * 	** execution:必须要
     * 	** 修饰符:可省略
     * 	** 返回值类型:必须要,但是可以使用*通配符
     * 	** 包名	:
     * 		** 多级包之间使用.分割
     * 		** 包名可以使用*代替,多级包名可以使用多个*代替
     * 		** 如果想省略中间的包名可以使用 ..
     * 	** 类名
     * 		** 可以使用*代替
     * 		** 也可以写成*DaoImpl
     * 	** 方法名:
     * 		** 也可以使用*好代替
     * 		** 也可以写成add*
     * 	** 参数:
     * 		** 参数使用*代替
     * 		** 如果有多个参数,可以使用 ..代替
     * @param joinPoint
     * @return
     */
//    @Around("execution(* com.sun.foodie.controller..*.*(..))")
    @Around("execution(* *..*.*Controller.*(..))")
    public Object recordTimeLog (ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("====== 开始执行 {}.{} ======",
                joinPoint.getTarget().getClass(),
                joinPoint.getSignature().getName());

        // 记录开始时间
        long begin = System.currentTimeMillis();

        // 执行目标 service
        Object result = joinPoint.proceed();

        // 记录结束时间
        long end = System.currentTimeMillis();
        long takeTime = end - begin;

        if (takeTime > 3000) {
            log.error("====== {}.{} 执行结束,耗时:{} 毫秒 ======", joinPoint.getTarget().getClass(), joinPoint.getSignature().getName(), takeTime);
        } else if (takeTime > 2000) {
            log.warn("====== {}.{} 执行结束,耗时:{} 毫秒 ======", joinPoint.getTarget().getClass(), joinPoint.getSignature().getName(), takeTime);
        } else {
            log.info("====== {}.{} 执行结束,耗时:{} 毫秒 ======", joinPoint.getTarget().getClass(), joinPoint.getSignature().getName(), takeTime);
        }

        return result;
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中实现环绕切面监控接口异常信息并打印logger日志,可以按照以下步骤进行: 1. 创建一个切面类,并标注@Aspect注解,用于定义切面的具体实现代码。 ```java @Aspect @Component public class ExceptionAspect { @Around("execution(* com.example.demo.controller.*.*(..))") public Object handleException(ProceedingJoinPoint joinPoint) throws Throwable { Object result = null; try { result = joinPoint.proceed(); } catch (Exception e) { Logger logger = LoggerFactory.getLogger(joinPoint.getTarget().getClass()); logger.error("接口异常信息:{},异常堆栈信息:{}", e.getMessage(), e); throw e; } return result; } } ``` 2. 在切面类中定义一个环绕通知方法,用于拦截指定的接口请求,并处理接口异常信息。在通知方法中,可以使用ProceedingJoinPoint参数调用目标方法并获取方法执行结果。如果方法执行过程中出现异常,可以使用Logger打印异常信息,并将异常重新抛出,以便后续处理。 3. 在切面类上添加@Component注解,将切面类注册到Spring容器中。 4. 在Spring Boot的配置文件中,添加以下配置,启用AOP切面功能。 ```properties spring.aop.auto=true ``` 通过以上步骤,就可以在Spring Boot应用中实现环绕切面监控接口异常信息并打印logger日志的功能。在应用程序执行过程中,如果接口出现异常,就会在控制台或日志文件中打印异常信息,方便开发人员进行排查和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值