开源日志管理方案 ELK/EFK

本贴最后更新于 1513 天前,其中的信息可能已经事过景迁

本文摘自:你必须知道的容器日志 (2) 开源日志管理方案 ELK/EFK

一、关于 ELK

1.1 ELK 简介

ELK 是 Elastic 公司提供的一套完整的日志收集以及展示的解决方案,是三个产品的首字母缩写,分别是 ElasticSearch、Logstash 和 Kibana。
image.png

  • Elasticsearch 是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能
  • Logstash 是一个用来搜集、分析、过滤日志的工具
  • Kibana 是一个基于 Web 的图形界面,用于搜索、分析和可视化存储在 Elasticsearch 指标中的日志数据

1.2 ELK 日志处理流程

image.png

上图展示了在 Docker 环境下,一个典型的 ELK 方案下的日志收集处理流程:

  • Logstash 从各个 Docker 容器中提取日志信息
  • Logstash 将日志转发到 ElasticSearch 进行索引和保存
  • Kibana 负责分析和可视化日志信息
      
    由于 Logstash 在数据收集上并不出色,而且作为 Agent,其性能并不达标。基于此,Elastic 发布了 beats 系列轻量级采集组件。
    image.png

这里我们要实践的 Beat 组件是 Filebeat,Filebeat 是构建于 beats 之上的,应用于日志收集场景的实现,用来替代 Logstash Forwarder 的下一代 Logstash 收集器,是为了更快速稳定轻量低耗地进行收集工作,它可以很方便地与 Logstash 还有直接与 Elasticsearch 进行对接。

本次实验直接使用 Filebeat 作为 Agent,它会收集我们在第一篇《Docker logs & logging driver》中介绍的 json-file 的 log 文件中的记录变动,并直接将日志发给 ElasticSearch 进行索引和保存,其处理流程变为下图,你也可以认为它可以称作 EFK。

image.png

二、ELK 套件的安装

本次实验我们采用 Docker 方式部署一个最小规模的 ELK 运行环境,当然,实际环境中我们或许需要考虑高可用和负载均衡。

首先拉取一下 sebp/elk 这个集成镜像,这里选择的 tag 版本是 latest(最新版本已经是 761 了):

docker pull sebp/elk:latest

注:由于其包含了整个 ELK 方案,所以需要耐心等待一会。

通过以下命令使用 sebp/elk 这个集成镜像启动运行 ELK:

docker run -it -d --name elk \
    -p 5601:5601 \
    -p 9200:9200 \
    -p 5044:5044 \
    sebp/elk:latest

 运行完成之后就可以先访问一下 http://192.168.4.31:5601 看看 Kibana 的效果:

image.png

image.png

当然,目前没有任何可以显示的 ES 的索引和数据,再访问一下 http://192.168.4.31:9200 看看 ElasticSearch 的 API 接口是否可用:

image.png

注意:

docker run -it -d --name elk \
    -p 5601:5601 \
    -p 9200:9200 \
    -p 5044:5044 \
   -e ES_MIN_MEM=512m \
    -e ES_MAX_MEM=1024m \
    sebp/elk:latest

三、Filebeat 配置

3.1 安装 Filebeat

这里我们通过 rpm 的方式下载 Filebeat,注意这里下载和我们 ELK 对应的版本(ELK 是 7.6.1,这里也是下载 7.6.1,避免出现错误):

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.1-x86_64.rpm
rpm -ivh filebeat-7.6.1-x86_64.rpm

注意:推荐迅雷下载,然后用 scp 上传到 Linux 主机上

3.2 配置 Filebeat

这里我们需要告诉 Filebeat 要监控哪些日志文件 及 将日志发送到哪里去,因此我们需要修改一下 Filebeat 的配置:

nano /etc/filebeat/filebeat.yml

要修改的内容为:

-(1)监控哪些日志?

filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.

- type: log

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /var/lib/docker/containers/*/*.log

这里指定 paths:/var/lib/docker/containers/*/*.log,另外需要注意的是将 enabled 设为 true

  • (2)将日志发到哪里?
#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["192.168.4.31:9200"]

  # Optional protocol and basic auth credentials.
  #protocol: "https"
  #username: "elastic"
  #password: "changeme"

这里指定直接发送到 ElasticSearch,配置一下 ES 的接口地址即可。

注意:如果要发到 Logstash,请使用后面这段配置,将其取消注释进行相关配置即可:

#----------------------------- Logstash output --------------------------------
#output.logstash:
  # The Logstash hosts
  #hosts: ["localhost:9200"]

  # Optional SSL. By default is off.
  # List of root certificates for HTTPS server verifications
  #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]

  # Certificate for SSL client authentication
  #ssl.certificate: "/etc/pki/client/cert.pem"

  # Client Certificate Key
  #ssl.key: "/etc/pki/client/cert.key"

3.3 启动 Filebeat

由于 Filebeat 在安装时已经注册为 systemd 的服务,所以只需要直接启动即可:

systemctl start filebeat

设置开机启动:

systemctl enable filebeat

检查 Filebeat 启动状态:

systemctl status filebeat

上述操作总结为脚本为:

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.1-x86_64.rpm
rpm -ivh filebeat-7.6.1-x86_64.rpm
echo "请输入elk主机地址 "
read host_ip

sed -i "s/  enabled: false/  enabled: true/g" /etc/filebeat/filebeat.yml
sed -i "s/\/var\/log\/\*.log/\/var\/lib\/docker\/containers\/\*\/\*.log/g" /etc/filebeat/filebeat.yml
sed -i "s/localhost:9200/${host_ip}:9200/g" /etc/filebeat/filebeat.yml

systemctl start filebeat
systemctl enable filebeat
systemctl status filebeat

四、Kibana 配置

接下来我们就要告诉 Kibana,要查询和分析 ElasticSearch 中的哪些日志,因此需要配置一个 Index Pattern。从 Filebeat 中我们知道 Index 是 filebeat-timestamp 这种格式,因此这里我们定义 Index Pattern 为 filebeat-*

image.png

image.png

点击 Next Step,这里我们选择 Time Filter field name 为 @timestamp:

image.png

单击 Create index pattern 按钮,即可完成配置。

这时我们单击 Kibana 左侧的 Discover 菜单,即可看到容器的日志信息啦:

image.png

仔细看看细节,我们关注一下 message 字段:
image.png

可以看到,我们重点要关注的是 message,因此我们也可以筛选一下只看这个字段的信息:

image.png

image.png

这里只是朴素的展示了导入 ELK 的日志信息,实际上 ELK 还有很多很丰富的玩法,例如分析聚合、炫酷 Dashboard 等等。笔者在这里也是初步使用,就介绍到这里啦。

五、Fluentd 引入

5.1 关于 Fluentd

前面我们采用的是 Filebeat 收集 Docker 的日志信息,基于 Docker 默认的 json-file 这个 logging driver,这里我们改用 Fluentd 这个开源项目来替换 json-file 收集容器的日志。

Fluentd 是一个开源的数据收集器,专为处理数据流设计,使用 JSON 作为数据格式。它采用了插件式的架构,具有高可扩展性高可用性,同时还实现了高可靠的信息转发。Fluentd 也是云原生基金会 (CNCF) 的成员项目之一,遵循 Apache 2 License 协议,其 github 地址为:https://github.com/fluent/fluentd/。Fluentd 与 Logstash 相比,比占用内存更少、社区更活跃,两者的对比可以参考这篇文章《Fluentd vs Logstash》

因此,整个日志收集与处理流程变为下图,我们用 Filebeat 将 Fluentd 收集到的日志转发给 Elasticsearch。

image.png

当然,我们也可以使用 Fluentd 的插件(fluent-plugin-elasticsearch)直接将日志发送给 Elasticsearch,可以根据自己的需要替换掉 Filebeat,从而形成 Fluentd => ElasticSearch => Kibana 的架构,也称作 EFK。

5.2 运行 Fluentd

这里我们通过容器来运行一个 Fluentd 采集器:

docker run -it -d --name fluentd \
    -p 24224:24224 \
    -p 24224:24224/udp \
    -v /etc/fluentd/log:/fluentd/log \
    fluent/fluentd:latest

默认 Fluentd 会使用 24224 端口,其日志会收集在我们映射的路径下。

此外,我们还需要修改 Filebeat 的配置文件,将/etc/fluentd/log 加入监控目录下:

#=========================== Filebeat inputs =============================

filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.

- type: log

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /etc/fluentd/log/*.log

添加监控配置之后,需要重新 restart 一下 filebeat:

systemctl restart filebeat

5.3 运行测试容器

为了验证效果,这里我们 Run 两个容器,并分别制定其 log-dirver 为 fluentd:

docker run -d \
           --log-driver=fluentd \
           --log-opt fluentd-address=localhost:24224 \
           --log-opt tag="test-docker-A" \
           busybox sh -c 'while true; do echo "This is a log message from container A"; sleep 10; done;'

docker run -d \
           --log-driver=fluentd \
           --log-opt fluentd-address=localhost:24224 \
           --log-opt tag="test-docker-B" \
           busybox sh -c 'while true; do echo "This is a log message from container B"; sleep 10; done;'

这里通过指定容器的 log-driver,以及为每个容器设立了 tag,方便我们后面验证查看日志。

5.4 验证 EFK 效果

这时再次进入 Kibana 中查看日志信息,便可以通过刚刚设置的 tag 信息筛选到刚刚添加的容器的日志信息了:

image.png

六、小结

本文从 ELK 的基本组成入手,介绍了 ELK 的基本处理流程,以及从 0 开始搭建了一个 ELK 环境,演示了基于 Filebeat 收集容器日志信息的案例。然后,通过引入 Fluentd 这个开源数据收集器,演示了如何基于 EFK 的日志收集案例。当然,ELK/EFK 有很多的知识点,笔者也还只是初步使用,希望未来能够分享更多的实践总结。

参考资料

CloudMan,《每天 5 分钟玩转 Docker 容器技术》

一杯甜酒,《ELK 学习总结》

于老三,《快速搭建 ELK 日志分析系统》

zpei0411,《Logstash beats 系列 & Fluentd》

曹林华,《从 ELK 到 EFK 的演进》

  • ELK
    23 引用 • 18 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...