1. 程式人生 > 實用技巧 >通過日誌監控service執行時間

通過日誌監控service執行時間

要監控到所有的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
@Component
public 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; } }