1. 引言
随着智能硬件成本降低和互联网网络的发展,在生活中场景的设备都已接入了网络中,其中传感器成为了设备获取外界信息的眼睛,网络成为设备交流的桥梁。在设备的交互中,往往存在着触发源,即标识控制指令的来源,在后端开发中,除了进行功能逻辑处理外,其中日志记录也非常重要,但是怎样去记录也非常的关键。
比如用户在APP
端点击了某个功能开关,场景的执行记录等等,这些云端都需要进行记录。这些记录在排查客诉的时候就能起到至关重要的作用,而不用大海捞针无脑去排查。接下来列举2
中记录日志的方式,推荐第二种方式,介绍一个中心化的日志记录。
2. 记录日志的方式
2.1 使用MySQL记录
其架构流程图:
在后端的技术栈中,MySQL
数据库应该是大家最为熟悉,应用最为广泛。在记录设备的操作日志也可以采用,如何搭建一个MySQL
的后端Demo
,可以参考之前的文档。
对于记录日志,需要开发两个接口:插入日志查询日志
2.1.1 定义业务日志实体
public class logDO{
StringapplianceId;
Mapcommand;
LocalDateTimecreateTime;
}
在实体类中,定义了三个元素:
applianceId
: 设备idcommand
: 操作的指令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
存储数据的项目越来越多,并且形成中心化存储之后非常的方便,只需在要存储的方法上添加响应的注解就能实现。