📣 大家好,我是 Zhan,一名个人练习时长两年的大三后台练习生 💻
📣 这篇文章是 Java 日志框架 的第三篇学习笔记 📙
📣 如果有不对的地方,欢迎各位指正🙏🏼
📣 以始为终 —— Just do it! 🫵🏼🫵🏼🫵🏼
👉引言
在上篇文章 5 分钟带你告别几个 G 的日志文件,再也不会看的眼花缭乱了 中我们介绍了如何在 Springboot 中使用 LogBack 对日志进行开发和测试环境分离以及时间和大小分割日志,但是我们还是忽视了一些问题:
- 为了保证高可用,我们一般会部署多节点,而多节点部署的场景下,将会有多个日志文件,导致日志难以定位,繁琐且低效
- 无法对日志数据进行查询功能和分析功能
对于这类分布式的问题,我们一般都会引入中间件解决分布式的问题,而本文将会讲到这类日志服务的解决方案:ElasticSearch + Logstash + Kibana,“妈妈再也不用担心我找不到日志了”:
至此你就可以在 Kibana 可视化界面,看到所有的日志信息,对日志信息进行筛选、检索、可视化:
一、ELK 和 ELFK
有了上面的本人这一灵魂画手,相信读者对于 ELK 究竟如何帮助我们实现日志框架有了一定的理解,这里就再次赘述一下 ELK 三个组件各自的作用:
- ElasticSearch: 是一个搜索和分析引擎,也是一个非关系型数据库(和 Redis 一样),由于倒排索引的缘故,ElasticSearch 的搜索性能很高,而我们搭建日志系统不需要了解 ElasticSearch 的语法
- LogStash: 是一个服务端数据处理管道,用人话说就是,可以从各个服务器来源采集数据,对数据进行一定的筛选和处理,然后把数据输出到 ES 这样的数据库中,也就是解决了我们在引言中提到的多节点部署的问题
- Kibana: 是一个可以把存储到 ES 中的数据使用图表和图形进行可视化,并可以让我们不懂 ES 语法的人对数据进行条件查询,也就是实现了我们在引言中说到的搜索和分析的问题
那为什么标题中还有一个 ELFK 呢?ELFK 其实表示的是 Beats + ElasticSearch + Logstash + Kibana。这其实是有两个原因:
- 首先就是 Beats 会提供给我们一些模版,例如 Nginx,使用它的模版我们可以快速搭建一个 Nginx 的可视化界面
- 再者就是 LogStash 其实是一个 Java 程序,对 CPU、内存、IO 的占用较高,因此 Elastic NV 也就是官方推出了使用 Go 语言写的 Beats 这一轻量级采集器,进行数据的采集,我们可以从文件大小中看出:
- 因此架构就又演变成了下图:
至此,其实我们就大概能够知道 ELFK 的总体架构,也就是 ELK Stack,而下面我们将逐一搭建这些环境并介绍它们的基本使用
二、ElasticSearch
对于 ES 的介绍,我们沿用官网的话Elasticsearch:官方分布式搜索和分析引擎 | Elastic:
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,Elasticsearch 会集中存储您的数据,让您飞快完成搜索,微调相关性,进行强大的分析,并轻松缩放规模。
注意事项
❗注意: 首先要声明两点部署的时候的注意事项:
- 后续部署的几个组件要做到版本统一(例如 ES 是 7.15.2,那么 LogStash 也应该是 7.15.2)
- 由于部署需要 Java 环境,相信大家都有,但是我也知道大家很多人都是用 JDK1.8,但是看图说话,也就是说我们最好使用 7.xx 版本
下载和部署
有了上述的说明,我们后续统一使用 7.5.1 版本进行学习和使用:Past Releases of Elastic Stack Software | Elastic,我的服务器是 ARM 架构,就下载的 ARM 版本
- 把下载好的包传入服务器,使用
tar -zxvf elasticsearch-7.5.1-linux-x86_64.tar.gz
进行解压,就可以得到这样的文件目录:
- 不难得出,其实它是一个 Java 程序,按照惯例我们可以在 bin 目录下找到它的执行文件,而在 config 目录中找到它的配置文件:
🧨踩雷: 如果此时你直接进入到 bin 目录使用 ./elasticsearch -d
运行的话不出意外的话你会报错(别问我怎么知道的 O.o):
原因: elasticsearch为了安全,不允许使用root用户启动,由于 ElasticSearch 可以接收用户输入的脚本并且执行,为了系统安全考虑,需要创建一个单独的用户用来运行 ElasticSearch。
解决方法: 创建一个用户组,并在该组中创建一个用户,给该组的用户赋予文档修改的权限仅仅是 ElasticSearch 这个目录下的权限:
# 创建 es 用户组
groupadd es
# 在该组下创建用户
useradd elasticsearch -g es -p123456
# 给这个用户赋予文档编辑权限
chown elasticsearch:es -R /usr/local/elk/elasticsearch-7.5.1
# 切换到这个用户
su elasticsearch
# 后台启动 ES
./elasticsearch -d
🧨踩雷: 咱就是说配置了用户组还要给用户组分配一定大小的内存区域,否则启动的时候还是会报错,别问我怎么知道的,我也不想知道,所以就需要进行以下操作:
# 在 /etc/security/limits.conf 中追加内容:
elasticsearch soft nofile 65535
elasticsearch hard nofile 65535
# 使用 ulimit 让配置生效
ulimit -n 65536
# 修改 /etc/sysctl.conf 没有的话就进行追加
vm.max_map_count=655360
# 让配置生效
sysctl -p
最后我们就可以通过 curl 0.0.0.0:9200 访问到本地的 ES 了:
三、LogStash 部署
上面的方法是去官网进行下载,但是我们可以使用 wget 方法直接拿到对应的包,所以后续就使用 wget 下载并完成后续的部署:
- 首先就是下载
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.5.1.zip
- 然后是解压
unzip logstash-7.5.1.zip
- 可以发现它的目录结构与 ES 也大致相似,因为都是 Java 程序:
我们可以使用 nohup bin/logstash -f config/logstash-sample.conf &
启动程序,并查看 nohup.out
的日志查看是否成功启动:
而我们使用的配置文件就代表了 LogStash 这个管道的功能:
- 【必选】输入(Input) 数据(包含但不限于日志)往往都是以不同的形式、格式存储在不同的系统中,而 Logstash 支持从多种数据源中收集数据(File、Syslog、MySQL、消息中间件等等)。
- 【可选】过滤器(Filter) :实时解析和转换数据,识别已命名的字段以构建结构,并将它们转换成通用格式。
- 【必选】输出(Output) :Elasticsearch 并非存储的唯一选择,Logstash 提供很多输出选择。
四、Beats
Beats 并不是单一的一种,它根据开发者的需求分为以下几种:
- Filebeat :轻量型日志采集器。
- Metricbeat :轻量型指标采集器。
- Packetbeat :轻量型网络数据采集器。
- Winlogbeat :轻量型 Windows 事件日志采集器。
- Auditbeat :轻量型审计日志采集器。
- Heartbeat :面向运行状态监测的轻量型采集器。
- Functionbeat :面向云端数据的无服务器采集器。
其实上述中我们使用的最多的是 FileBeat 和 MetricBeat,前者用于采集日志文件,也就是 Springboot 输出的日志文件,而后者是进行服务的监控,例如 Nginx 的请求数、活跃的连接数……
而下面我们以 FileBeat 为例,搭建环境,实现简单的管道输送到 ES 中:
- 首先就是下载
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.1-darwin-x86_64.tar.gz
- 然后就是解压:
tar -zxvf filebeat-7.5.1-darwin-x86_64.tar.gz
- 可以看到目录结构和前面很明显差别,因为它使用 Go 语言写的:
- 所以这里简单解释一下:配置文件就是
filebeat.yml
,而可执行文件就是filebeat
- 注意:如果此处的二进制文件启动不了,大家可以自己去官网进行下载对应的版本,因为这个版本可能和大家的 Linux 的版本不是很符合
然后我们可以看到它的配置文件中我们主要需要配置的三个部分:
#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/ws/ws-manage.log
#- c:programdataelasticsearchlogs*
#-------------------------- Elasticsearch output ------------------------------
# output.elasticsearch:
# hosts: ["localhost:9200"]
#protocol: "https"
#username: "elastic"
#password: "changeme"
#----------------------------- Logstash output --------------------------------
output.logstash:
hosts: ["localhost:5044"]
这里我们使用 LogStash 记录日志,而不是直接输入到 ElasticSearch 中
修改好配置文件之后我们就可以启动了: nohup ./filebeat &
五、Kibana
用官网 Kibana:数据的探索、可视化和分析 | Elastic 的话来介绍 Kibana:
使用 Kibana 针对大规模数据快速运行数据分析,以实现可观测性、安全和搜索。对来自任何来源的任何数据进行全面透彻的分析,从威胁情报到搜索分析,从日志到应用程序监测,不一而足。
部署到这里,其实主要的流程我们都已经清楚了,所以这里直接 po 代码:
# 下载
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-7.5.1-darwin-x86_64.tar.gz
# 解压
$ tar -zxvf kibana-7.5.1-darwin-x86_64.tar.gz
$ cd kibana-7.5.1-darwin-x86_64
# 配置配置文件 注意的是这里的配置文件都已经写好 只需要把注释去掉即可
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
kibana.index: ".kibana"
# 启动
nohup bin/kibana &
# 访问
http://127.0.0.1:5601/
💬 总结
本文首先讲了使用常规的日志框架的缺点,也就是没有检索和筛选功能,并且对于多节点部署查看日志更是不方便,因此就引入了 ELK 这种方式,虽然解决的方式不止这一种,例如 阿里云、腾讯云 的服务也可以做到。
而由于 LogStash 是一个重量级的应用,Elastic 官方使用 Go 语言编写的 Beats 减轻了服务器的 IO、CPU、内存 负担,也就是所谓的 ELFK 架构,而其中四个服务的作用也在本文中进行了讲解:
- LogStash:日志收集管道
- Beats:主要使用 File 和 Metric 两种,用于采集日志
- ElasticSearch:用于存储和检索日志,是一个非关系型数据库
- Kibana: 让 ES 可视化,图形化界面让我们更方便进行日志的检索和分析
由于篇幅问题,我把与 Springboot 也就是项目的结合放在了下一篇博客,究竟 ELK 能和我们的项目结合到什么样的程度,能方便我们开发者多少,敬请期待!
🍁 友链
- 5 分钟带你告别几个 G 的日志文件,再也不会看的眼花缭乱了! - 掘金 (juejin.cn)
- 阿里面试:说了多少遍要用门面模式的日志框架? - 掘金 (juejin.cn)
- 芋道 ELK(Elasticsearch + Logstash + Kibana) 极简入门
- 芋道 Spring Boot 日志平台 ELK + Filebeat 入门
- Elastic Stack:Elasticsearch、Kibana、Beats 和 Logstash | Elastic
- 16.Kibana入门之Nginx 日志仪表盘_哔哩哔哩_bilibili
- 最新elasticsearch版本与jdk版本对应图
✒写在最后
都看到这里啦~,给个点赞再走呗~,也欢迎各位大佬指正以及补充,在评论区一起交流,共同进步!也欢迎加微信一起交流:Goldfish7710。