第八章:使用攔截器記錄你的SpringBoot的請求日誌

請求日誌幾乎是全部大型企業級項目的必要的模塊,請求日誌對於咱們來講後期在項目運行上線一段時間用於排除異常、請求分流處理、限制流量等。請求日誌通常都會記錄請求參數、請求地址、請求狀態(Status Code)、SessionId、請求方法方式(Method)、請求時間、客戶端IP地址、請求返回內容、耗時等等。若是你得系統還有其餘個性化的配置,也能夠完成記錄。git

本章目標

經過SpringBoot整合與攔截器整合完成請求日誌的記錄,本章節日誌記錄使用SpringDataJPA與MySQL數據庫記錄。spring

構建項目

咱們使用InteiiJ IDEA建立一個SpringBoot項目,預先依賴模塊有Web、JPA、MySQL、Druid等。項目結構以下圖1所示:數據庫


圖1

配置數據源

咱們直接從以前的項目中複製一個application.yml文件到/resource下,application.yml內容以下圖2所示:json


圖2

建立數據表結構

咱們把請求日誌直接保存到本地的MySQL數據庫內,下面咱們先來建立一個請求日誌表,結構以下圖3所示:restful


圖3

咱們表結構內的字段比較多,數據結構建立完成後,接下來根據表結構建立實體並配置實體JPA,以下圖4所示:數據結構


圖4

能夠看到上圖4,咱們對應數據庫內的表名以及字段名建立實體映射、字段映射,根據實體咱們建立一個實現SpringDataJPA接口JpaRepository的子接口,LoggerJPA,以下圖5所示:app


圖5

JpaRepository接口包含了SpringDataJPA內的經常使用到的CRUD方法,後面章節咱們會拿出來分支來專門講解SpringDataJPA使用。框架

建立日誌攔截器

咱們上面的步驟有關請求日誌的存儲已經編寫完成,那麼咱們接下來須要編寫一個請求日誌的攔截器,自定義SpringMVC攔截器須要實現HandlerIntercptor接口,而且實現內部的三個方法,以下圖6所示攔截器代碼詳情:maven


圖6

上面的三個方法在前面章節:第六章:如何在SpringBoot項目中使用攔截器已經講過了,這裏就很少作解釋了,有須要的請去看下個人第六章講解。
這裏須要注意一點,咱們在攔截器內沒法經過SpringBean的方式注入LoggerJPA,我只能經過另一種形式。spring-boot

WebApplicationContextUtils

這個工具類能夠經過HttpServletRequest請求對象的上下文(ServetCotext)獲取Spring管理的Bean,具體代碼以下圖7所示:


圖7

能夠看到上圖7建立了一個getDAO的方法,方法須要傳入一個實體的類型,以及一個HttpServetRequest請求對象,經過WebApplicationContextUtils內部的getRequiredWebApplicationContext方法獲取到BeanFactory(實體工廠類),從而經過工廠實體的getBean方法就能夠拿到SpringDataJPA爲咱們管理的LoggerJPA持久化數據接口實例。

記錄請求日誌

咱們處理日誌請求時須要用到FastJson、HttpServet依賴,因此咱們修改pom.xml配置文件加入FastJson開源組件以及HttpServlet的maven依賴,以下圖8所示:


圖8

接下來咱們開始編寫請求日誌的建立,首先咱們在preHandle方法內建立LoggerEntity實體,並記錄一些必要參數後將實體寫入到當前請求對象HttpServletRequest內,以下圖九、圖10所示:


圖9

圖10

能夠看到咱們上面記錄了咱們日誌實體內的大部分參數,當用戶發送請求時在進入SpringMVC的控制器以前會進入preHandle方法,而後記錄下咱們的請求日誌內容,並將請求日誌的實體寫入到請求對象內,下面就會進入對應springMVC控制器方法的方法,在最後渲染視圖即將返回前臺的時候開始執行咱們下面須要邊寫的afterCompletion方法,代碼以下圖11所示:


圖11

咱們在afterCompletion方法內記錄了請求相應碼、請求時間戳、請求返回值等。其中請求返回值咱們是在哪裏設置的呢?那麼咱們接下來開始編寫測試請求控制器IndexController。你就會明白了。

編寫測試控制器

咱們在controller包下建立一個IndexController而且添加@RestController註解來標明IndexController是一個restful風格的控制器。以下圖12所示:


圖12

咱們在IndexControll控制器內簡單添加了一個測試方法login,能夠看到咱們在攔截器內的疑問獲得的解釋,LOGGER_RETURN是從咱們的請求方法傳入到LoggerInterceptor攔截器內afterCompletion方法中的。

配置攔截器

上述咱們的代碼基本已經編寫完成,不要忘記最重要的一步,咱們須要將LoggerInterceptor攔截器添加到咱們的SpringBoot項目內,讓SpringBoot項目能夠識別攔截。咱們須要建立一個LoggerConfguration配置類,以下圖13所示:


圖13

咱們的項目編碼已經完成,下面咱們來嘗試運行項目看看效果。

初嘗試運行項目

運行日誌以下圖14所示,若是沒有出現異常證實項目運行成功了,若是出現異常請根據對應異常檢查錯誤。


圖14

咱們項目已經運行成功,那麼咱們接下來測試咱們的請求日誌是否能夠記錄成功,咱們先來訪問地址:http://127.0.0.1:8080/index/login?name=yuqiyu(簡書插入連接沒法帶參數,請複製到地址欄訪問),效果以下圖15所示:


圖15

能夠看到咱們成功的返回了在IndexControll的login方法配置的json信息,那麼個人請求日誌是否已經記錄到數據庫呢?咱們先來看下InteiiJ IDEA工具的控制器是否已經打印了SQL,以下圖16所示:


圖16

能夠看到已經正常打印了,咱們打開表查看下數據,以下圖17所示:


圖17

咱們已經將請求日誌成功的寫入到數據庫。

總結

上述內容就是本章的所有講解,本章主要講解了SpringBoot項目如何配置日誌攔截器,將用戶的請求參數寫入到數據庫內,使用SpringDataJPA以及Druid鏈接池完成數據的持久化操做。當前若是要在企業級大型項目使用,還請按期清理請求日誌。若是你有記錄錯誤日誌發送郵件的需求,能夠經過判斷HttpServertReponse對象的statusCode來完成,具體的錯誤堆棧信息記錄,須要咱們後續章節講解。

本章內容已經更新到碼雲

SpringBoot配套源碼地址:gitee.com/hengboy/spr…

SpringCloud配套源碼地址:gitee.com/hengboy/spr…

SpringBoot相關係列文章請訪問:目錄:SpringBoot學習目錄

QueryDSL相關係列文章請訪問:QueryDSL通用查詢框架學習目錄

SpringDataJPA相關係列文章請訪問:目錄:SpringDataJPA學習目錄

SpringBoot相關文章請訪問:目錄:SpringBoot學習目錄,感謝閱讀!

歡迎加入QQ技術交流羣,共同進步。


QQ技術交流羣
相關文章
相關標籤/搜索