SpringBoot AOP,收集日誌、統計方法執行時長
阿新 • • 發佈:2019-01-05
用過Spring 的開發者都知道它有兩大核心功能,1.依賴注入(IOC、DI)、2.面向切面程式設計(AOP)。
AOP:面向切面程式設計,往往用來實現關注點的分離的技術。系統是由許多不同的元件所組成的,每一個元件各負責一塊特定功能。可以很好的整合日誌收集、許可權攔截、執行監控等功能。
同時,它對系統也是無入侵的,無須改動其他業務程式碼,就能達到收集資訊的目的,非常贊。
1.在專案中新增AOP引用
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2.在專案中新建架包,建立SysAspect類,加入切面註解等,具體看下面程式碼
//AOP切面 :多個切面時,@Order(i)註解來標識切面的優先順序。i的值越小,優先順序越高 @Order(5) @Aspect @Component public class SysAspect { @Pointcut("execution(public * com.zypcy.expend.controller.*.*(..))") public void log(){} private static final org.slf4j.Logger logger = LoggerFactory.getLogger(SysAspect.class); //統計請求的處理時間 ThreadLocal<Long> startTime = new ThreadLocal<>(); @Before("log()") public void doBefore(JoinPoint joinPoint) throws Throwable{ startTime.set(System.currentTimeMillis()); //接收到請求,記錄請求內容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //記錄請求的內容 System.out.println("Aspect_URL:"+request.getRequestURL().toString()); System.out.println("Aspect_Method:"+request.getMethod()); } @AfterReturning(returning = "ret" , pointcut = "log()") public void doAfterReturning(Object ret){ //處理完請求後,返回內容 System.out.println("方法返回值:"+ JSON.toJSONString(ret) +",方法執行時間:"+ (System.currentTimeMillis() - startTime.get())); } }
啟動專案,訪問IndexController的getUserInfo方法,
再看後臺,切面類中列印的結果:
訪問控制器時,請求會先進入SysAspect攔截器,攔截器中可以實現系統的日誌採集,記錄使用者訪問了那些模組方法,方法的執行時間是多長,把這些日誌資料收集後進行聚合統計、分析,能看到使用者的再系統中的訪問情況,針對性的優化,看程式碼
現在只是列印在本地,可以整合Elasticsearch與Kibana,聚合這些日誌資料,做一些統計工作,用來對功能與產品進行決策和調整