1. 程式人生 > >SpringBoot AOP,收集日誌、統計方法執行時長

SpringBoot AOP,收集日誌、統計方法執行時長

用過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,聚合這些日誌資料,做一些統計工作,用來對功能與產品進行決策和調整