天天看点

用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​​

如果你觉得本篇文章对你有所帮助,不如右上角关注一下我~