通過日誌監控service執行時間
阿新 • • 發佈:2020-07-24
要監控到所有的service,就需要用到spring的aop外掛
一、pom.xml引入aop外掛
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
二、新建ServiceLogAspect檔案(名字隨便起),用來定義監控的配置
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 @Componentpublic class ServiceLogAspect { public static final Logger log = LoggerFactory.getLogger(ServiceLogAspect.class); /** * AOP通知: * 1. 前置通知:在方法呼叫之前執行 * 2. 後置通知:在方法正常呼叫之後執行 * 3. 環繞通知:在方法呼叫之前和之後,都分別可以執行的通知 * 4. 異常通知:如果在方法呼叫過程中發生異常,則通知 * 5. 最終通知:在方法呼叫之後執行 */ /** * 切面表示式: * execution 代表所要執行的表示式主體 * 第一處 * 代表方法返回型別 *代表所有型別 * 第二處 包名代表aop監控的類所在的包 * 第三處 .. 代表該包以及其子包下的所有類方法 * 第四處 * 代表類名,*代表所有類 * 第五處 *(..) *代表類中的方法名,(..)表示方法中的任何引數 * * @param joinPoint * @return * @throws Throwable */ @Around("execution(* com.zb.service.impl..*.*(..))") public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("====== 開始執行 {}.{} ======", joinPoint.getTarget().getClass(), // 目標class 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("====== 執行結束,耗時:{} 毫秒 ======", takeTime); } else if (takeTime > 2000) { log.warn("====== 執行結束,耗時:{} 毫秒 ======", takeTime); } else { log.info("====== 執行結束,耗時:{} 毫秒 ======", takeTime); } return result; } }