1 概述
在Springcloud微服务中,基于docker容器化的部署应用,排查线上问题,通过日志来定位是经常使用的手段之一,甚至是最有效的。
在使用ELFK之前,我在实际使用过程中,排查问题显得十分复杂,需要进入服务器,使用docker logs -f --tail=100 容器名,来排查问题,因为没有持久化日志的原因,这样排查十分复杂,只有场景重现才能定位到问题。
后来演进持久化日志,挂载到宿主机的logs文件中,但依然相对复杂。因为考虑到线上服务为了实现高可用往往采用多节点部署,又或者随着项目愈发复杂会考虑微服务架构,导致日志分散在不同的服务器上,导致排查一个问题,需要登陆多台服务器,查询在其上的日志,非常繁琐且低效,不可能到每个机器都去查询一次,万一有100台呢?
所以,此时我们需要一个统一的实时【日志服务】,将我们需要的日志全部收集在一起,并提供灵活的查询功能。一般来说,一个完整的日志服务,需要提供如下 5 个功能:
- 收集 :能够采集多个来源的日志数据。
- 传输 :能够稳定的把日志数据传输到日志服务。
- 存储 :能够存储海量的日志数据。
- 查询 :能够灵活且高效的查询日志数据,并提供一定的分析能力。
- 告警 :能够提供提供告警功能,通知开发和运维等等。
1.1 解决方案
搜集常见的解决方案,其中ELK(Elasticsearch+Logstash+Kibana)以及ELFK(Elasticsearch + Logstash + Kibana + Filebeat),呼声最高
- ELK(Elasticsearch+Logstash+Kibana): 工作流程如下图
- ELFK(Elasticsearch + Logstash + Kibana + Filebeat):工作流程如下图
从上面可以看出 ELFK是基于ELK做出的升级版本,有的朋友可能就会问了,ELK已经可以了,为什么还要在中间加个Filebeat,这样不冗余吗?
在采集日志数据时,我们需要在服务器上安装一个 Logstash。不过 Logstash 是基于 JVM 的重量级的采集器,对系统的 CPU、内存、IO 等等资源占用非常高,这样可能影响服务器上的其它服务的运行。所以,Elastic NV 推出 Beats ,基于 Go 的轻量级采集器,对系统的 CPU、内存、IO 等等资源的占用基本可以忽略不计。因此,就变成了 ELFK 。其中Beats 负责采集数据,并通过网路传输给 Logstash
1.2 Elasticsearch
FROM https://www.elastic.co/cn/products/elasticsearch
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。
Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。
1.3 Logstash
FROM https://www.elastic.co/cn/products/logstash
官方介绍:Logstash is an open source data collection engine with real-time pipelining capabilities。简单来说logstash就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供里很多功能强大的滤网以满足你的各种应用场景。
1.4 Beats
FROM https://www.elastic.co/cn/products/beats
轻量型数据采集器 :Beats 平台集合了多种单一用途数据采集器。它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据。
在 Beats 发布之后,Elastic NV 重新定义 ELK ,升级成 Elastic Stack。如下图:
Beats 是一个全品类采集器的系列,包含多个:
- Filebeat :轻量型日志采集器。
- Metricbeat :轻量型指标采集器。
- Packetbeat :轻量型网络数据采集器。
- Winlogbeat :轻量型 Windows 事件日志采集器。
- Auditbeat :轻量型审计日志采集器。
- Heartbeat :面向运行状态监测的轻量型采集器。
- Functionbeat :面向云端数据的无服务器采集器。
本小节,我们使用 Filebeat,采集日志文件。
2 部署安装
本章节是基于docker容器环境以及docker-compose编排
ELK的部署安装请参考我的上一篇文章ELK日志系统的搭建
2.1 下载Elasticsearch、Logstash、Kibana、Filebeat
docker pull elasticsearch:7.7.1
docker pull logstash:7.7.1
docker pull kibana:7.7.1
2.2 开始搭建ELFK环境
- 新建elk文件夹
mkdir elk
cd elk
mkdir elasticsearch filebeat logstash
- 进入logstash目录创建logstash.conf文件内容
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => "es:9200"
index => "filebeat_%{[fields][log_source]}-%{+YYYY.MM.dd}"
}
}
在 Logstash 中,我们通过定义了一个 Logstash 管道(Logstash Pipeline),来读取、过滤、输出数据。一个 Logstash Pipeline 包含三部分,如下图所示:Logstash Pipeline
【必选】输入(Input) 数据(包含但不限于日志)往往都是以不同的形式、格式存储在不同的系统中,而 Logstash 支持从多种数据源中收集数据(File、Syslog、MySQL、消息中间件等等)。
【可选】过滤器(Filter) :实时解析和转换数据,识别已命名的字段以构建结构,并将它们转换成通用格式。
【必选】输出(Output) :Elasticsearch 并非存储的唯一选择,Logstash 提供很多输出选择。
在 logstash-sample.conf 配置文件中,我们配置了 Input 和 Output。
- Output 比较好理解,写入数据到Elasticsearch存储器中。
- Input 定义了 5044 端口,接收Beats的数据。
在采集日志数据时,我们需要在服务器上安装一个 Logstash。不过 Logstash 是基于 JVM 的重量级的采集器,对系统的 CPU、内存、IO 等等资源占用非常高,这样可能影响服务器上的其它服务的运行。所以,Elastic NV 推出 Beats ,基于 Go 的轻量级采集器,对系统的 CPU、内存、IO 等等资源的占用基本可以忽略不计。
- 进入filebeat目录创建filebeat.yml文件内容
#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/logs/springboot/sparksys-authorization.log # 配置我们要读取的 Spring Boot 应用的日志
fields:
#定义日志来源,添加了自定义字段
log_source: authorization
- type: log
enabled: true
paths:
- /var/logs/springboot/sparksys-gateway.log
fields:
log_source: gateway
- type: log
enabled: true
paths:
- /var/logs/springboot/sparksys-file.log
fields:
log_source: file
- type: log
enabled: true
paths:
- /var/logs/springboot/sparksys-oauth.log
fields:
log_source: oauth
#================================ Outputs =====================================
#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
# Array of hosts to connect to.
# hosts: ["192.168.3.3:9200"]
#----------------------------- Logstash output --------------------------------
output.logstash:
# The Logstash hosts
hosts: ["logstash:5044"]
- filebeat.inputs 配置项,设置 Filebeat 读取的日志来源。该配置项是数组类型,可以将 Nginx、MySQL、Spring Boot 每一类,作为数组中的一个元素。这里,我们配置读取一个 Spring Boot 应用的日志。
- output.elasticsearch 配置项,设置 Filebeat 直接写入数据到 Elasticsearch 中。虽然说 Filebeat 5.0 版本以来,也提供了 Filter 功能,但是相比 Logstash 提供的 Filter 会弱一些。所以在一般情况下,Filebeat 并不直接写入到 Elasticsearch 中。这里,我们注释掉该配置项,设置 Filebeat 不写入到 Elasticsearch 中。
- output.logstash 配置项,设置 Filebeat 写入数据到 Logstash 中。这里,我们配置写入到Logstash中。
2.3 使用docker-compose.yml脚本启动ELK服务
docker-compose.yml内容
version: '3'
services:
elasticsearch:
image: elasticsearch:7.7.1
container_name: elasticsearch
environment:
- "cluster.name=elasticsearch" #设置集群名称为elasticsearch
- "discovery.type=single-node" #以单一节点模式启动
- "ES_JAVA_OPTS=-Xms512m -Xmx1024m" #设置使用jvm内存大小
volumes:
- /Users/zhouxinlei/docker/elfk/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
- /Users/zhouxinlei/docker/elfk/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
ports:
- 9200:9200
restart: always
kibana:
image: kibana:7.7.1
container_name: kibana
links:
- elasticsearch:es #可以用es这个域名访问elasticsearch服务
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
environment:
- "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
ports:
- 5601:5601
restart: always
logstash:
image: logstash:7.7.1
container_name: logstash
volumes:
- /Users/zhouxinlei/docker/elfk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
links:
- elasticsearch:es #可以用es这个域名访问elasticsearch服务
ports:
- 5044:5044
restart: always
filebeat:
image: elastic/filebeat:7.7.1
container_name: filebeat
links:
- logstash:logstash #可以用es这个域名访问elasticsearch服务
volumes:
- /Users/zhouxinlei/logs/:/var/logs/springboot/ # 宿主机实际应用日志文件映射到容器内部
- /Users/zhouxinlei/docker/elfk/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml
depends_on:
- logstash #kibana在elasticsearch启动之后再启动
restart: always
挂载目录可根据自身环境进行修改
2.4 使用docker-compose命令运行
docker-compose up -d
注意:Elasticsearch启动可能需要好几分钟,要耐心等待
- 在logstash中安装json_lines插件
# 进入logstash容器
docker exec -it logstash /bin/bash
# 进入bin目录
cd /bin/
# 安装插件
logstash-plugin install logstash-codec-json_lines
# 退出容器
exit
# 重启logstash服务
docker restart logstash
- 开启防火墙并在kibana中查看
防火墙命令可根据自身环境进行执行
systemctl stop firewalld
- 查看收集的日志
3 总结
至此,我们完成了使用 Kibana 对「Beatat」收集的日志文件的日志的查询。美滋滋~
之后部署集群环境下,就不需要大量的去搜索排查问题,在Kibana根据条件筛选任意时段的任意日志数据
评论区