通过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; } }