利用自定義註解加攔截器實現日誌統一管理

最近需要給系統開發一個日誌處理的功能,但是不想改動原有的代碼。所以想採用低侵入式的方式來增加日誌管理功能。最後決定採用自定義註解加攔截器的方式來完成日誌處理。

實現功能類

首先需要一個LogEnum枚舉來完成對日誌的分類以及在枚舉中存儲不同的日誌處理對象。然後需要一個LogAnnotation自定義註解,來完成對方法的切入以及利用枚舉進行方法分類。需要一個實體類Log存儲日誌內容。一個LogActionService接口來定義日誌返回格式。最後就是定義一個攔截器LogInterceptor來進行日誌的攔截啦。

具體實現

LogEnum

  • 枚舉一共有三個字段,code表示分類,moduleName表示日誌監控模塊,serviceName表示用來處理日誌存儲格式的service類。

LogAnnotation

  • 註解中只有一個value字段,用來存儲枚舉類型。

Log

  • 日誌類存儲主鍵,用戶id,用戶IP,用戶名,郵箱,處理時間以及動作的描述,動作模塊,模塊Code,創建時間等。其中動作模塊與枚舉類型中的moduleName對應,模塊Code和枚舉類型中的Code對應,這樣可以做到不同類型的日誌的區分。而動作描述則有服務類來進行處理封裝,服務類由枚舉類型中的serviceName得出。

LogActionService

  • LogActionService是一個用來返回服務描述的接口。返回的對象用來作爲Log表中的actionDesc。針對於枚舉類型中的每一個模塊,都會有一個子類來實現LogActionService以便完成屬於自己的日誌描述。本着對修改關閉,對擴展開放的原則,在原有的日誌監控基礎上,如有想要新增接口的監控,只需要在枚舉類型中新增一個枚舉,然後新建一個LogActionService的子類來完成獨立的日誌封裝。

LogInterceptor

  • LogInterceptor就是進行日誌監控的攔截器啦。logService是一個對日誌進行操作的service。因爲攔截器本身是單例的,所以全部變量需要設置成ThreadLocal類型的,這樣可以保證每一個線程的變量都是獨立的。startTime服務開始時間,endTime是服務結束時間,log中存儲的是Log這個類的對象。攔截器主要邏輯是對日誌類進行一些封裝然後存儲到數據庫當中。(LogActionService) ApplicationContextUtil.getApplicationContext().getBean(logAnnotation.value().getServiceName())這句代碼可以根據枚舉類型中的serviceName來獲取service對象。這裏將所有的service對象統一交付給Spring管理了,所以在獲取對象是只需要得到ApplicationContext對象然後調用getBean方法即可。 ApplicationContextUtil是自己封裝的一個獲取ApplicationContext對象的工具類,也可以通過其他方式來獲取這個對象。最後就是在攔截器鏈調用完畢之後要記得銷燬ThreadLocal對象。

調用方式

只需要在Cotroller上面加上自己想要加入的日誌註解就行啦。

總結

本質上就是利用了攔截器AOP的特性,可以在方法執行的前後插入代碼來實現日誌管理的。

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