概述
一般的業(yè)務(wù)系統(tǒng)都需要記錄用戶的操作行為和監(jiān)控用戶對(duì)數(shù)據(jù)的改動(dòng),以便事后監(jiān)察或分析問題原因践啄。jeecg 框架已默認(rèn)提供了“系統(tǒng)日志”和“數(shù)據(jù)日志”這兩個(gè)模塊臣淤,下面讓我們來看一下它是怎么實(shí)現(xiàn)的吧筝野。
系統(tǒng)日志
首先顶猜,讓我們看一下最終的展示效果:
從截圖可以看出沧奴,系統(tǒng)日志記錄了用戶的行為類型、日志內(nèi)容长窄、IP扼仲、用戶信息、瀏覽器抄淑、操作時(shí)間等數(shù)據(jù)。然后從代碼分析得知驰后,這些數(shù)據(jù)都保存在 t_s_log 這張表中肆资。接下來,讓我們跟著代碼看看是怎么獲取數(shù)據(jù)并插入到數(shù)據(jù)庫的灶芝。
以用戶退出的日志舉例郑原,在 LoginController.logout( ) 方法里調(diào)用了 SystemService.addLog( ) 方法,傳入了“日志內(nèi)容”夜涕、“日志類型”犯犁、“日志級(jí)別”這三個(gè)數(shù)據(jù),不過開發(fā)人員把“日志類型”和“日志級(jí)別”這兩個(gè)參數(shù)搞反了(v3.7.2版本)女器,由于在數(shù)據(jù)庫都是用的數(shù)字保存酸役,在界面上轉(zhuǎn)義回文字時(shí)也能有對(duì)應(yīng)的值,也不影響查看驾胆,只是大家留意有這個(gè)問題即可涣澡。而在 addLog( ) 方法里,代碼構(gòu)造了一個(gè) TSLog 對(duì)象丧诺,然后把各字段的值保存進(jìn)去入桂,用戶的IP、瀏覽器信息可從 Request 對(duì)象獲取驳阎,用戶信息則從 session 中獲取抗愁。最后,調(diào)用對(duì)應(yīng)的 Dao 對(duì)象方法呵晚,把實(shí)體對(duì)象保存到數(shù)據(jù)庫里蜘腌。
從代碼分析可以看出,jeecg 框架對(duì)行為日志的記錄是直接嵌入到業(yè)務(wù)代碼里的饵隙,要記錄哪些類型的日志逢捺,需要在調(diào)用的對(duì)應(yīng)業(yè)務(wù)方法里增加 addLog( ) 方法的調(diào)用,并定義好日志類型的 code 和日志內(nèi)容格式癞季。這種實(shí)現(xiàn)方式可能開發(fā)人員在寫代碼時(shí)思路會(huì)比較順暢劫瞳,但缺點(diǎn)是不靈活且重復(fù)代碼較多倘潜。
數(shù)據(jù)日志
讓我們?cè)倏匆幌聰?shù)據(jù)日志的實(shí)現(xiàn)。同樣志于,先來一張截圖看下展示效果:
數(shù)據(jù)日志記錄下了數(shù)據(jù)所在的表名涮因、數(shù)據(jù)id、數(shù)據(jù)版本號(hào)伺绽、數(shù)據(jù)內(nèi)容养泡、創(chuàng)建人等內(nèi)容,保存在 t_s_data_log 這張表里奈应。其中澜掩,數(shù)據(jù)內(nèi)容是以 json 格式序列化的字符串。當(dāng)選擇兩條同一張表的數(shù)據(jù)時(shí)杖挣,還提供了“數(shù)據(jù)比較”功能肩榕,如果是同一個(gè)數(shù)據(jù)id的不同版本數(shù)據(jù),就可以看出這兩個(gè)版本的數(shù)據(jù)差異了惩妇。
下面來分析一下代碼實(shí)現(xiàn)株汉,在 SystemService 類提供了 public void addDataLog(String tableName, String dataId, String dataContent);
方法,傳入表名歌殃、數(shù)據(jù)id和 json 格式的數(shù)據(jù)內(nèi)容即可插入數(shù)據(jù)乔妈。再看下 SystemServiceImpl 實(shí)現(xiàn)類里該方法的實(shí)現(xiàn)邏輯,先從 t_s_data_log 表根據(jù)表名和數(shù)據(jù)id查詢出當(dāng)前最大的版本id氓皱,然后把版本id加1路召,構(gòu)造出一個(gè)新的數(shù)據(jù)實(shí)體,然后持久化到數(shù)據(jù)庫里波材,便完成了优训。經(jīng)過代碼搜索,框架里已有模塊的代碼里并沒有調(diào)用 addDataLog( ) 方法的地方各聘,但應(yīng)用的方式應(yīng)該跟行為日志的調(diào)用方式一致揣非,在對(duì)數(shù)據(jù)做增刪改時(shí),都可以調(diào)用方法插入一條數(shù)據(jù)變更日志躲因。
一些思考
關(guān)于行為日志和數(shù)據(jù)日志的記錄早敬,我在以前的公司使用的框架也有類似的封裝,但相較于 jeecg 框架的實(shí)現(xiàn)大脉,會(huì)更靈活些搞监。我們是采用 AOP 的方式對(duì)業(yè)務(wù)方法做編織,實(shí)現(xiàn)業(yè)務(wù)與日志的解耦镰矿,然后通過配置文件配置需要采集日志的業(yè)務(wù)方法琐驴,并配置用來標(biāo)識(shí)的 code 及一些描述信息。而對(duì)數(shù)據(jù)日志的記錄,則是在jdbc層對(duì)要執(zhí)行的 sql 做攔截绝淡,類似 druid 連接池對(duì) sql 的解析宙刘,得到本次操作要修改的數(shù)據(jù),然后插入到數(shù)據(jù)庫牢酵。
以上方式對(duì)日志的采集悬包,都是為了在一套系統(tǒng)內(nèi)完成所有的事情,難免會(huì)對(duì)業(yè)務(wù)系統(tǒng)的正常運(yùn)行造成性能影響或是邏輯上的侵入馍乙。而現(xiàn)在互聯(lián)網(wǎng)公司的做法布近,一般對(duì)行為日志的采集交由前端統(tǒng)一上報(bào)到日志系統(tǒng),而對(duì)數(shù)據(jù)日志的采集則是根據(jù)交易流水號(hào)丝格,打印詳細(xì)的交易日志撑瞧,然后用日志分析系統(tǒng)采集日志文件數(shù)據(jù),做到業(yè)務(wù)系統(tǒng)與日志系統(tǒng)相隔離显蝌。
沒有最好的方案预伺,只有最適合的方案。開發(fā)時(shí)應(yīng)根據(jù)實(shí)際需求的規(guī)模琅束、工期、要求等等因素算谈,選取最適合項(xiàng)目的技術(shù)方案角雷。