SpringBoot使用AOP記錄請求日誌和異常日誌

  • 本文基礎WEB環境使用SpringBoot及Spring-Data-Jpa構建
  • 關於SpringBoot及JPA用法本文再也不過多討論,下面是引入的jar:mysql


     
    起步依賴

     
    web及aop依賴

     
    jpa依賴

     
    mysql驅動
  • 本文着重AOP的使用,你也可使用本身構建的環境
  1. 因爲本文中使用的JPA,所以首先建立保存日誌及保存異常的實體類,若是你使用的是Mybatis,則須要首先建立表而後根據表來逆向生成實體類
  • 保存日誌的實體類:web


     
    日誌實體
  • 保存異常的實體類:sql


     
    異常實體

  1. 接下來咱們定義一個Operation註解,用於聲明在方法上描述此方法執行了什麼操做:工具


     
    操做註解
  • @Target 聲明這是一個自定義註解類,ElementType.METHOD 代表此註解可聲明在方法上
  • @Retention 聲明註解保留期限,RetentionPolicy.RUNTIME 代表此註解可保留至運行時,能夠經過反射獲取註解信息

  1. 而後編寫一個AOP切面類,因爲使用的SpringBoot只要保證在Application子目錄之下就被會自動掃描,因此只須要註解聲明便可,並不須要額外配置測試


     
    請求切面
  • @Aspect 聲明這是一個切面類
  • @Compoent 此類交由Spring容器管理

  1. 定義請求日誌切入點:debug


     
    切入點
  • @PointCut 定義請求日誌切入點,其切入點表達式有多種匹配方式,詳細請自行參閱資料,此處切入點爲全部聲明@Operation註解的方法

  1. 編寫方法的前置通知:代理


     
    前置通知
  • 前置通知在執行目標方法以前執行
  • 在前置通知中設置請求日誌信息,如開始時間,請求參數,註解內容等

  1. 編寫方法的返回通知:日誌


     
    返回通知
  • 返回通知,在目標方法正常結束以後執行
  • 在返回通知中補充請求日誌信息,如返回時間,方法耗時,返回值,而且保存日誌信息

  1. 編寫方法的異常通知:get


     
    異常通知
  • 異常通知,在目標方法非正常結束,發生異常或者拋出異常時執行
  • 在異常通知中設置異常信息,並將其保存

  1. Spring AOP 共計五種通知,因爲本文中只須要三種,其它兩種只作簡單介紹,若有興趣請自行查閱資料
  • 後置通知:在目標方法執行以後執行,與返回通知不一樣的是此通知沒法拿到返回值,而且無論是否發生異常都會執行
  • 環繞通知:圍繞動態代理的全過程,須要攜帶ProceedingJoinPoint參數,而且必須有返回值,且ProceedingJoinPoint類型的參數能夠決定是否執行目標方法

  1. 在前置通知中設置請求日誌信息的工具類:
  • 獲取請求IPio


     
    獲取請求IP
  • 獲取請求方式


     
    獲取請求方式
  • 獲取切入點的參數信息


     
    獲取切入點的參數信息

     
    獲取切入點的參數信息

  1. 編寫一個簡易Controoler,用於測試請求日誌記錄:


     
    測試請求日誌
  • 啓動SpringBoot以後,訪問測試請求日誌的URL,查看請求日誌表記錄,能夠看到日誌已成功記錄:


     
    請求成功

     
    請求日誌表記錄
  • 接下來把測試請求日誌的Controoler修改成拋出一個異常,測試異常記錄:

 
測試異常日誌
  • 而後從新啓動SpringBoot,再次訪問剛纔的URL,能夠看到產生了異常:


     
    請求異常
  • 再次查看請求日誌表,發現仍是一條記錄,說明異常通知執行後並不會執行返回通知,這正是咱們指望的結果:


     
    請求日誌記錄
  • 而後咱們再查看異常記錄表,發現已經將異常記錄:


     
    異常日誌

至此,SpringBoot AOP記錄請求日誌和異常日誌完成

做者:陪你一塊兒debug 連接:https://www.jianshu.com/p/d8a654993719 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索