我们已经不用AOP做操作日志了! | 原力计划
來源 | JAVA葵花寶典
責編 | 王曉曼、Carol
?頭圖 | CSDN下載自東方IC
前言
用戶在操作我們系統的過程中,針對一些重要的業務數據進行增刪改查的時候,我們希望記錄一下用戶的操作行為,以便發生問題時能及時的找到依據,這種日志就是業務系統的操作日志。
本篇我們來探討下常見操作日志的實現方案和可行性!
常見的操作日志類型
用戶登錄日志
重要數據查詢日志 (但電商可能不重要的數據也做埋點,比如在淘寶上你搜索什么商品,即使不買,一段時間內首頁也會給你推薦類似的東西)
重要數據變更日志 (如密碼變更,權限變更,數據修改等)
數據刪除日志
......
總結來說,就是重要的增刪改查根據業務的需要來做操作日志的埋點。
實現方案對比
1、基于AOP(切面)傳統的實現方案
優點:實現思路簡單;
缺點:增加數據庫的負擔,強依賴前端的傳參,不方便拓展,不支持批量操作,不支持多表關聯;
2、基于數據庫Binlog
優點:解除了數據新舊變化的耦合,支持批量操作,方便多表關聯拓展,不依賴開發語言;
缺點:數據庫表設計需要統一的約定;
方案實現細節
1、基于AOP切面+注解的傳統方案
傳統的做法就是切面+注解的方式,這種對代碼的侵入性不強,通常記錄ip、業務模塊、操作賬號、操作場景、操作來源等等,一般在注解+攔截器里這些值都拿得到,如下圖所示:
這種常見的我們在通用方法都可以處理,但是在數據變更方面,一直沒有較好的實現方式,比如數據在變更前是多少,變更后是多少。
以我們以前實現的一套方案來說,基于數據變更的記錄方式不僅要和需求方約定好模板(上百個字段的不可能都做展示和記錄),也要和前端做一些約定,比如在修改之前的值是多少,修改后的值是多少,如下代碼客觀請看:
????@Valid@NotNull(message?=?"新值不能為空")@UpdateNewDataOperationLogprivate?T?newData;@Valid@NotNull(message?=?"舊值不能為空")@UpdateOldDataOperationLogprivate?T?oldData; 存在的問題:舊值如果不多查詢一次數據庫則需要依賴前端把舊值封裝到oldData對象中,很有可能已經不是修改前的值;
無法處理批量的List數據;
不支持多表操作;
再以一個場景為例,再刪除之前需要記錄刪除前的值,是不是還得再查一次~
@PostMapping("/delete") @ApiOperation(value?=?"刪除用戶信息",?notes?=?"刪除用戶信息") @DeleteOperationLog(system?=?SystemNameNewEnum.SYS_JMS_LMDM,?module?=?ModuleNameNewEnum.LMDM_AUTH,?table?=?LogBaseTableNameEnum.TABLE_USER,?methodName?=?"detail") 2、基于數據庫Binlog 方案系統架構圖如下:
「主要分為3塊:」
業務應用:生成每次操作的traceid,并更新到操作的業務表中,發送1條業務消息,包含當前操作的操作人相關的信息;
日志收集應用:對業務日志和轉換后的binlog日志做整合,提供對外的日志查詢搜索API;
日志處理應用:利用canal采集和解析業務庫的binlog日志并投遞到kafka中(實現方案可以參考《如何基于Canal和 Kafka,實現 MySQL 的Binlog 近實時同步?》),解析后的記錄中記錄了當前操作的操作類型,如屬于刪除、修改、新增,和新舊值的記錄,格式如下:
庫表設計
所有業務系統表需要添加trace_id字段,每次操作生成一個隨機字符串并保存到業務表中;
日志收集應用庫表設計。
效果:
3、基于Binlog實現方案未來規劃
優化發送業務消息的實現,使用切面攔截減少對業務代碼的侵入;
目前暫時不支持對多表關聯操作日志記錄,需要拓展。
總結
本文以操作日志為題材討論了操作日志的實現方案和可行性,并且都已經在功能上進行實現,其中使用AOP方案也是大部分中小企業的首選實現方案,但是在一些金融領域以及ERP相關系統,對操作日志記錄明細要求極高,常見技術方案很難滿足。
即使能夠滿足也會帶來一些代碼強侵入以及性能問題,所以我們又討論了基于Binlog實現的方案,該方案雖然比對AOP來說增強了技術的復雜性,但是對于有一定技術積累的團隊來說不算什么難事,并且該方案我們都實現了上線,并且解決了代碼層面上的侵入,屬于跨語言級別的,相信對讀者還是有一定的啟發。
?
推薦閱讀
一文帶你從頭認識什么是「緩存」!
在 520 這天,竟然有人把 Docker講清楚了? | 原力計劃
如何使用 SQL Server FILESTREAM 存儲非結構化數據?這篇文章告訴你!
平安科技王健宗:所有 AI 前沿技術,都可以在聯邦學習中大展身手!
踢翻這碗狗糧:程序員花 7 個月敲出 eBay,只因女票喜歡糖果盒!
又一年5.20,用Python助力程序員脫單大攻略(視頻版)
斗地主嗎?能學區塊鏈那種! | 原力計劃
真香,朕在看了!
總結
以上是生活随笔為你收集整理的我们已经不用AOP做操作日志了! | 原力计划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反转!物联网火爆,开发者却很难入门?
- 下一篇: 阿里面试官整理的JVM面试要点,99%的