【電商項目】-通過日誌監控service執行時間

前言

本篇博客主要是描述我們通過日誌文件來監控我們項目中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 毫秒======



總結

通過我們這個切面代碼的編寫,這個工具類,可以使用到實際項目中,方便監控項目中每個方法的執行時間,從而爲我們進行項目的優化提供了很好的幫助,同時如果我們項目切面進行攔截業務層代碼,這一點我們大家要考慮,是否會影響項目的效率,每個請求都攔截,打印日誌,這一點我們要好好的考慮一下。😂

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章