通过log4j监控service执行时间

这个有什么用呢?会检测你的系统哪些部分需要优化。

为什么要用这个呢?如果每一个方法都搞一个开始时间和结束时间,那么如果你的方法很多的话,这就行不通了,而且就算你不怕麻烦,那么测试之后,你还要一个一个的将这些删除,很费时间

1.因为需要用到 aop切面,所以在pom添加依赖:

<!--aop 切面-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

首先创建一个包 aspect,然后创建 ServiceLogAspect类:

package com.imooc.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;

@Aspect
@Component
public class ServiceLogAspect {

    /**
     *   AOP通知:
     *   1.前置通知: 在方法调用之前执行
     *   2.后置通知: 在方法正常调用之后执行 (方法报异常,执行不了)
     *   3.环绕通知: 在方法调用之前和之后,都分别可以执行的通知
     *   4.异常通知:如果在方法调用过程中发生异常,则通知
     *   5.最终通知:在方法调用之后执行
     */

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


    /**
     *
     *   切面表达式:
     *   execution: 代表所要执行的表达式主题:
     *   第一处: * 代表方法返回类型, *代表所有类型
     *   第二处: 包名代表 aop 监控的类所在的包
     *   第三处: ..代表代表该包以及其子包下的所有类方法
     *   第四处: * 代表类名,*代表所有类
     *   第五处: *(..) *代表类中的方法名,(..)表示方法中的任何参数
     *
     *
     *
     * @param joinPoint
     * @return
     * @throws Throwable
     */

    //环绕通知
    @Around("execution(* com.imooc.service.impl..*.*(..))")
    public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {

          log.info("============开始执行 {}.{} ===========",
                                joinPoint.getTarget().getClass(),
                                joinPoint.getSignature().getName());//表明执行某个service类的某个方法
          //记录开始时间
          Long begin=System.currentTimeMillis();
          //执行目标 service
          Object result=joinPoint.proceed();
          //记录结束时间
          Long end=System.currentTimeMillis();
          Long takeTime=end - begin ;
          if (takeTime>3000){
                log.error("========执行结束,耗时:{}毫秒========",takeTime);
          }else if (takeTime>2000&&takeTime<3000){
              log.warn("========执行结束,耗时:{}毫秒========",takeTime);
          }else {
              log.info("========执行结束,耗时:{}毫秒========",takeTime);
          }
          return result;
    }

}

发布了55 篇原创文章 · 获赞 5 · 访问量 6068

猜你喜欢

转载自blog.csdn.net/weixin_42528855/article/details/103527077
今日推荐