前言
本篇博客主要是描述我們通過日誌文件來監控我們項目中service層,方法前後,請求數據執行的時間,目的是我們在實際的開發中,可以排查項目中代碼存在哪些需要調整的地方:
代碼練習
- 場景:
我們可以根據請求方法的不同時間,來打印不同的日誌級別的信息,這樣可以有效監控我們的方法是否存在設計缺陷:
創建我們的切面編程:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
package com.zcw.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;
/**
* @program: zcw-foodie-dev
* @description: AOP
* @author: Zhaocunwei
* @create: 2020-05-10 10:37
**/
@Aspect
@Component
public class ServiceLogAspect {
public static final Logger log = LoggerFactory.getLogger(ServiceLogAspect.class);
/**
* AOP 通知
* 1. 前置通知: 在方法調用之前執行
* 2. 後置通知: 在方法正常調用之後執行
* 3. 環繞通知: 在方法調用之前和之後,都分別可以執行的通知
* 4. 異常通知: 如果在方法調用過程中發生異常,則通知
* 5. 最終通知: 在方法調用之後執行
*/
/**
* 切面表達式:
* execution 代表所要執行的表達式主體
* 第一處 * 代表方法返回類型 * 代表所有類型
* 第二處 包名代表aop監控的類所在的包
* 第三處.. 代表該包以及其子包下的所有類方法
* 第四處 * 代表類名,* 代表所有類
* 第五處 *(..) *代表類中的方法名,(..)表示方法中的任何參數
* @param proceedingJoinPoint
* @return
* @throws Throwable
*/
@Around("execution(* com.zcw.service.impl..*.*(..))")
public Object recorTimeLog(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
log.info("======開始執行 {}.{}=====",
proceedingJoinPoint.getTarget().getClass(),
proceedingJoinPoint.getSignature().getName());
//記錄開始時間
long begin = System.currentTimeMillis();
//執行目標service
Object result = proceedingJoinPoint.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;
}
}
- install項目:
測試:
- 啓動成功:
- 訪問接口查看控制檯日誌打印:
2020-05-10 11:10:44.934 INFO 1231 --- [nio-8088-exec-3] com.zcw.aspect.ServiceLogAspect : ======開始執行 class com.zcw.service.impl.UserServiceImpl.queryUserForLogin=====
2020-05-10 11:10:45.000 INFO 1231 --- [nio-8088-exec-3] com.zaxxer.hikari.HikariDataSource : DateSourceHikariCP - Starting...
2020-05-10 11:10:45.001 WARN 1231 --- [nio-8088-exec-3] com.zaxxer.hikari.util.DriverDataSource : Registered driver with driverClassName=com.mysql.jdbc.Driver was not found, trying direct instantiation.
2020-05-10 11:10:45.281 INFO 1231 --- [nio-8088-exec-3] com.zaxxer.hikari.HikariDataSource : DateSourceHikariCP - Start completed.
2020-05-10 11:10:45.310 INFO 1231 --- [nio-8088-exec-3] com.zcw.aspect.ServiceLogAspect : ======執行結束,耗時:376 毫秒======
總結
通過我們這個切面代碼的編寫,這個工具類,可以使用到實際項目中,方便監控項目中每個方法的執行時間,從而爲我們進行項目的優化提供了很好的幫助,同時如果我們項目切面進行攔截業務層代碼,這一點我們大家要考慮,是否會影響項目的效率,每個請求都攔截,打印日誌,這一點我們要好好的考慮一下。😂