1. 引言
随着智能硬件成本降低和互联网网络的发展,在生活中场景的设备都已接入了网络中,其中传感器成为了设备获取外界信息的眼睛,网络成为设备交流的桥梁。在设备的交互中,往往存在着触发源,即标识控制指令的来源,在后端开发中,除了进行功能逻辑处理外,其中日志记录也非常重要,但是怎样去记录也非常的关键。
比如用户在APP
端点击了某个功能开关,场景的执行记录等等,这些云端都需要进行记录。这些记录在排查客诉的时候就能起到至关重要的作用,而不用大海捞针无脑去排查。接下来列举2
中记录日志的方式,推荐第二种方式,介绍一个中心化的日志记录。
2. 记录日志的方式
2.1 使用MySQL记录
其架构流程图:

在后端的技术栈中,MySQL
数据库应该是大家最为熟悉,应用最为广泛。在记录设备的操作日志也可以采用,如何搭建一个MySQL
的后端Demo
,可以参考之前的文档。搭建SpringBoot和Mysql Demo
对于记录日志,需要开发两个接口:插入日志查询日志
2.1.1 定义业务日志实体
public class logDO{
StringapplianceId;
Mapcommand;
LocalDateTimecreateTime;
}
在实体类中,定义了三个元素:
-
applianceId
:设备id -
command
:操作的指令 -
createTime
:操作的时间该实体也对应于数据库中的字段。
用户APP
上点击一次,就会在数据库中存储一次;因此就需要暴露出来两个接口实现日志插入和日志查询。
2.1.2 接口
@RestController
@RequestMapping("/device")
public class LogController{
privatefinalLogServicelogService;
publicLogController(LogServicelogService) {
this.logService=logService;
}
@PostMapping
publicList<LogDO>getLog(@RequestBody LogDO logDO) {
// todo 获取日志
}
@PostMapping
public void addLog(@RequestBody LogDO logDO) {
// todo 添加记录到mysql中
}
}
如上就是一个简单日志记录Demo
,所有的数据都是存在MySQL
。因此该日志的实现非常简单,但是也带来其他不好的影响;
-
随着 MySQL
数据库中数量的增加,其查询的速度就会受限,毕竟磁盘IO
操作非常耗时。 -
代码冗余,所有的日志插入都需要入库,代码难于维护。 -
并且根据功能日志过于分散,不利于之后的数据汇总和分析。
对此提出了另一种方式来实现日志存储:ElasticSearch
。
2.2 ElasticSearch实现日志记录
2.2.1 日志记录架构

如上就是使用ES记录日志的架构图,其中主要部分的就是ES
(ElasticSearch
缩写)。
-
Elasticsearch
是支持分布式搜索和分析的引擎。 -
Elasticsearch
能为所有类型的数据提供近乎实时的搜索和分析。 -
无论是结构化文本还是非结构化文本,数字数据或地理空间数据,
Elasticsearch
都能以支持快速搜索的方式有效地对其进行存储和索引。
并且在架构图中,使用AOP
来实现代码入侵,在Service
使用AOP
技术,实现日志记录。同理,使用ES
也可以在Controller
保留出RESTful
接口,提供给APP
端访问。
2.2.2 使用ES的优势
-
使用上 ES
,后端可以统一对日志进行管理,方便后续的日志查询和数据分析。 -
ES强大的模糊查询,当进行模糊查询的时候,对于 MySQL
索引是失效的,会对整个表进行检索,耗时剧增。对ES
而言,分词后,每个字都可以利用FST高速找到倒排索引的位置,并迅速获取文档id
列表,大大的提升了性能,减少了磁盘IO
。
3. 结尾
目前使用ES
存储数据的项目越来越多,并且形成中心化存储之后非常的方便,只需在要存储的方法上添加响应的注解就能实现。
原文始发于微信公众号(CodeJames):还在用MySQL存日志?
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/148244.html