0、为啥学习ES
在公司开发一段时间以来,我一直对公司提供的统一日志平台很感兴趣。在容器化部署项目时,我们都没有关心过日志打印到哪里去了,有没有落盘,之后要想查询应用日志,只需要去统一日志平台页面搜索一下就完事儿了。
但是一直没有想过这个是怎么实现的。
通过研究发现,目前的日志之所以能从日志平台搜索到,我了解的大概有2个途径:
1、日志落盘放到某个路径下,然后采集工具(例如logstash、filebeat)采集路径下的日志数据推送给elasticsearch
2、在项目中引入统一日志平台的开发jar包依赖,然后应用在使用log.info、log.error等接口时,直接把日志输出给elasticsearch
springboot项目中,slf4j提供了一套日志打印的API,然后各个日志框架只需要实现这些API,就可以完成对日志的打印。例如:log4j、logback等。
因此,有的日志框架可以在实现slf4jAPI的同时,可以直接把日志按照一定的格式,推送给elasticsearch,这样一来,我们的日志文件就没有必要把日志输出到文件里面了。之后要查询日志,只需要去检索es就可以了。
一、Elasticsearch快速入门
可以参考这篇文章: https://www.cnblogs.com/sunsky303/p/9438737.html
二、ELK系统的搭建
ELK不是单独指某个系统,而是elasticsearch、logstash、kibana的合称。
E:elasticsearch的简称,主要用于检索
L: logstash,主要用于搜集数据提供给elasticsearch,提供数据保障
K:kibana,es是不提供前端UI展现的(elasticsearch-head可以部分展现,但是功能不够强大),但是提供了很多API,kibana就是专门用于展现es数据的一个系统,通过他可以直观的展现es数据
个人搭建: 搭建elk系统,最好保持三个应用的版本一直,我的线下实验中,使用的版本都是 7.6.2,目前已经准确搭建成功,并能在自己的java实验项目中完成了日志搜集及查询的功能,也完成了搜索关键字联想的功能
2.1、elasticsearch的搭建
为了快速搭建,采用docker搭建,安装有问题时,随时可以铲除容器实例,重新安装,对于新手来说,十分方便
搭建可以参考文章: https://cloud.tencent.com/developer/article/1612794
2.2、logstash的搭建
搭建可以参考文章: https://cloud.tencent.com/developer/article/1703928
其中,在编写采集配置文件时,例如如下配置,
input {
file {
#标签
type => “systemlog-localhost”
#采集点
path => “/var/log/messages”
#开始收集点
start_position => “beginning”
#扫描间隔时间,默认是1s,建议5s
stat_interval => “5”
}
}
output {
elasticsearch {
hosts => [“192.168.31.196:9200”]
index => “logstash-system-localhost-%{+YYYY.MM.dd}”
}
}
需要注意的是,path => “/var/log/messages” 只是定义了采集特定目录的文件,若想配置采集某个目录下,子目录下的特定后缀名的文件内容,可以修改为:
path => "/var/log/messages//*.log 或者 path => "/var/log/messages//.;
例如:我的Springboot实验项目,日志文件夹的存放路径格式为:
/home/ecs-datadisk-01/tiansj-portal-logs/
2021-11-01/
2021-11-01-0.log
2021-11-01-1.log
2021-11-02/
2021-11-02-0.log
我的配置为: path => "/home/ecs-datadisk-01/tiansj-portal-logs/**/*.log;
2.3、kibana的搭建
搭建可以参考文章: https://cloud.tencent.com/developer/article/1705098
三、elk环境搭建总结
在使用docker搭建elk环境时,不要上来就编写容器创建脚本,需要多收集资料,查看es、logstash、kibana的各个关键路径,例如数据文件、配置文件、日志输出、用户自定义配置文件、插件等的输出路径,将这些路径通过挂载到本机的路径的方式
持久化到本机的特定目录。系统相关的路径挂载到操作系统路径,日志和数据文件相关的路径持久化到外挂数据盘的路径,便于数据的恢复。
我在搭建过程中遇到的问题:
1、logstash配置文件扫描路径后,没有扫描到数据
解决方案: 引起的原因是因为我的日志文件夹里面包含太多子文件夹,因此需要修改日志扫描文件的扫描路径,path => "/home/ecs-datadisk-01/tiansj-portal-logs//*.log; 加入了的通配符
2、elk系统首次搭建完毕后,基本上都是不需要认证的,在生产环境是相当危险的
解决方案: 在elasticsearch配置xpack,然后配置认证文件等,具体过程可以百度一下,然后可以将es生成的各种系统默认的用户名和密码配置到logstash、kibana的配置文件中。再次访问kibana、es时,就需要输入用户名和密码了
3、通过kibana检索日志数据时,有时候中文词检索命中的搜索结果不是很准确
解决方案: elasticsearch默认的分词器对中文的分词不是很准,需要安装第三方的中文分词器插件,可以百度一下国内比较流行的中文分词器插件自行安装
四、我了解的ES的用途
1、日志检索
2、用户搜索历史检索
3、搜索关键字联想,例如京东搜索某个商品时,如果某个词,页面会自动查询这个关键字对应的可能的搜索目标,如搜索手机,可能出现 小米手机、苹果手机、手机壳等等
4、全文检索
注意:以上内容纯属参考,若发现有错误或误解,敬请谅解,可以留言告知我修改哈