如何優雅地記錄操作日誌

極簡部落格發表於2022-12-31

日誌對於一個系統來說不可或缺,對於問題的排查,問題的再現有著至關重要的作用。由於不想從日誌檔案一行行摸索,想追求簡單、快捷、方便;只需根據條件就可以檢索到相應介面日誌,以及是否出現報錯的情況。同時我不想用在業務程式碼中記錄業務日誌的方式。那還有什麼方法呢?思考片刻,想到了用 AOP 的方式去記錄介面日誌。
於是秉著一勞永逸的思想。我打算將專案封裝成 starter,在需要用到的地方,直接引入即可生效。無需做更多複雜、繁瑣、重複的工作。

具體做法分三步走

  1. 定義日誌級別列舉,因為不同日誌級別,代表著介面方法不同的日誌記錄方式。包括:NONE 不記錄日誌,INFO 記錄正常日誌,ERROR 記錄異常日誌, ALL 記錄全部日誌行為。
  2. 定義 AOP 透過 @Logger 註解完成需要增強的切入點,使用 @Around 環繞增強完成介面方法 入參、出參等資訊的填補。
  3. 使用 @PostConstruct 完成 日誌表結構 的初始化,使得只需要引入依賴即可自動完成日誌的生成與記錄。

詳細描述

由於在1點和 3點相對簡單,接下來就不再贅述,以下主要針對 2 點 進行詳細描述。

  1. 由於涉及到註解完成切點,於是我相容了註解在 類 上 和 方法 上都可以完成操作,注意,此處方法上的註解優先順序更高些,這也使得一個類下可以排除某些方法,使得運用更加靈活多變。
  2. 初始化日誌實體資料,透過 ProceedingJoinPoint 引數以及 Hutool 工具類完成相關資訊的提取。
  3. 透過開啟新執行緒的方式完成日誌的持久化,因為不想影響到主業務邏輯的執行。
@Around("@within(com.cpz.log.annotation.Logger) || @annotation(com.cpz.log.annotation.Logger)")
public Object doAround(ProceedingJoinPoint point) throws Throwable

使用效果

  1. 透過 maven 將專案打包,並將依賴安裝到本地倉庫,方便其它專案使用,同時為了方便這一流程,實現了將 jar 打包為本地依賴的指令碼檔案,install.bat
mvn install:install-file -Dfile=../spring-boot-starter-logger/target/spring-boot-starter-logger-1.0.jar -DgroupId=com.cpz -DartifactId=spring-boot-starter-logger -Dversion=1.0 -Dpackaging=jar

2) 引入依賴

<dependency>
    <groupId>com.cpz</groupId>
    <artifactId>spring-boot-starter-logger</artifactId>
    <version>1.0</version>
</dependency>

3) 開啟記錄介面日誌

@Logger(level = LogLevel.ALL)
@GetMapping("/test/query")
public List<User> query(User user) {
    return userService.list();
}
  1. 呼叫介面檢視資料庫日誌表資訊
(1, '/test/query', 'com.cpz.mybatisplus.controller.LoggerController', 'query', '192.168.42.104', '169.254.180.230', 1, '{\"Accept\":\"*/*\",\"User-Agent\":\"PostmanRuntime/7.30.0\",\"Host\":\"192.168.42.104:8080\",\"Accept-Encoding\":\"gzip, deflate, br\",\"Postman-Token\":\"9c3015be-c5a4-4195-8c76-45a03203e201\",\"Content-Length\":\"40\",\"Content-Type\":\"application/json\"}', '{\"user\":{\"name\":\"zhansan\"}}', '[{\"name\":\"戰三\",\"id\":1,\"age\":11,\"email\":\"cpzisme@qq.com\"},{\"name\":\"李四\",\"id\":2,\"age\":12,\"email\":\"lisi@qq.com\"},{\"name\":\"王五\",\"id\":3,\"age\":121,\"email\":\"das@qq.com\"}]', '', 153, '2022-12-31 15:55:47');

可以看到,已經完成日誌記錄。

自此,本次日誌記錄就講到這裡,感謝閱讀!

由於作者學識有限,文中如有不足之處或有需要改進和最佳化的地方,不吝賜教。
文章原始碼

相關文章