天天看點

用Elasticsearch代替資料庫存儲日志方式

之前的項目中一直使用的是資料庫表記錄使用者記錄檔的,但随着時間的推移,資料庫log單表是越來越大「不考慮删除」,再加上近期項目中需要用到​<code>​Elasticsearch​</code>​,是以幹脆把這些使用者日志遷移到ES上來了。

環境:SpringBoot2.2.6 + Elasticsearch6.8.8

如果你還不了解Elasticsearch的話,可以參考之前的幾篇文章:

ES基本概念:​

​https://blog.51cto.com/u_11827525/2860275​

重溫ES基礎:​

​https://blog.51cto.com/u_11827525/2860242​

ES-Windows叢集搭建:​

​https://blog.51cto.com/u_11827525/2860239​

ES-Docker叢集搭建:​

​https://blog.51cto.com/u_11827525/2854808​

MacOS中ES搭建:​​​​​

​​https://blog.51cto.com/u_11827525/2860233​​

由于之前就是使用的​<code>​AOP+注解​</code>​方式實作日志記錄,而本次依舊采用這種方式,是以改動不大,把儲存至資料庫換成ES就可以了,開始吧。

文章最後我會提供源碼的,正文描述部分有省略~

​<code>​pom.xml​</code>​檔案中引入需要的​<code>​es​</code>​、​<code>​aop​</code>​所需的依賴:

加入​<code>​elasticsearch​</code>​的配置資訊:

使用了​<code>​lombok​</code>​「 @Data 注解」簡化 ​<code>​set\get​</code>​,​<code>​spring-data-elasticsearch​</code>​提供了​<code>​@Document​</code>​、​<code>​@Id​</code>​、​<code>​@Field​</code>​注解,其中​<code>​@Document​</code>​作用在實體類上,指向文檔位址,​<code>​@Id​</code>​、​<code>​@Field​</code>​作用于成員變量上,分别表示​<code>​主鍵​</code>​、​<code>​字段​</code>​。

資料操作層,有兩種方式實作對​<code>​Elasticsearch​</code>​資料的修改,一是使用​<code>​ElasticsearchTemplate​</code>​,二是通過​<code>​ElasticsearchRepository​</code>​接口,本文基于後者接口方式。

用過​<code>​SpringDataJPA​</code>​的小夥伴就不陌生了,如下實作接口就跟​<code>​JPA​</code>​通過方法名稱生成​<code>​SQL​</code>​一樣簡單。

預設情況下,​<code>​ElasticsearchRepository​</code>​提供了​<code>​findById()​</code>​、​<code>​findAll()​</code>​、​<code>​findAllById()​</code>​、​<code>​search()​</code>​等方法供我們友善使用。

自定義 @SystemLog 注解,用于标記需要記錄日志的方法。

步驟5中自定義了注解,那麼接下來就是定位注解,以及對定位後的方法進行業務處理部分了,而對我們來說就是把日志記錄至​<code>​Elasticsearch​</code>​中。

​<code>​EsLogService​</code>​中我們編寫幾個常用的接口方法,增删改查:

我們簡單看一下這個 ​<code>​findAll​</code>​ 方法的實作類吧,其他方法就是直接調用​<code>​ElasticsearchRepository​</code>​提供的​<code>​findById()​</code>​、​<code>​findAll()​</code>​、​<code>​findAllById()​</code>​、​<code>​save()​</code>​等方法。

以 ​<code>​getA()​</code>​方法為例,直接通過浏覽器調用:​​http://127.0.0.1:6666/log/getA​​,然後在 ES 中查詢一下是否儲存成功:

用Elasticsearch代替資料庫存儲日志方式

image-20200526224423804

以getAll()方法為例,再測試一下查詢方法,在浏覽器輸入 ​​http://127.0.0.1:8888/log/getAll?key=&amp;type=2​​,傳回如下:

用Elasticsearch代替資料庫存儲日志方式

image-20200526224614801

本節是我拆分出來的一個demo,經測試增删改查是沒問題、同時查詢方法加入了分頁查詢,具體代碼細節可以下載下傳本節源碼自行檢視。

源碼下載下傳連結:​​https://niceyoo.lanzous.com/id0yikf​​

如果你覺得本篇文章對你有所幫助,不如右上角關注一下我~