前言
目前,主流的 ELK(Elasticsearch,Logstash,Kibana)已经转变为 EFK(Elasticsearch,Filebeat 或 Fluentd,Kibana)。在容器云的日志方案中,普遍推荐使用 Fluentd。下面我们来看看从 ELK 到 EFK 发生了哪些变化,并同时推荐大家了解一下 Grafana Loki。
ELK和EFK概述
随着各种软件系统的复杂度不断增加,特别是部署到云上之后,想要登录各个节点查看各个模块的日志基本上是不可行的。这不仅效率低下,而且由于安全性的考虑,工程师无法直接访问各个物理节点。此外,现在大规模的软件系统通常采用集群部署方式,意味着对于每个服务,会启动多个完全相同的 POD 来提供服务,每个容器都会生成自己的日志。仅从生成的日志来看,你无法确定是哪个 POD 生成的日志,这使得查看分布式日志变得更加困难。
因此,在云时代,我们需要一种收集并分析日志的解决方案。首先,我们需要将分布在各个角落的日志收集到一个集中的地方以方便查看。一旦收集起来,我们还可以进行各种统计分析,甚至可以使用流行的大数据或机器学习方法进行分析。当然,对于传统的软件部署方式,同样需要类似的日志解决方案,但本文主要从云的角度来介绍。
ELK 就是这样的解决方案,实际上已经成为了事实上的标准。ELK 是三个开源项目的首字母缩写,具体如下:
- E: - Elasticsearch
- L: - Logstash
- K: - Kibana
Logstash 的主要作用是收集分布在各处的日志并进行处理;
Elasticsearch 则是一个集中存储日志的地方,更重要的是它是一个全文检索和分析引擎,可以让用户以几乎实时的方式查看和分析海量数据。
Kibana 则是为 Elasticsearch 开发的前端图形化界面,使用户可以轻松查询 Elasticsearch 中存储的数据,并提供各种分析模块,例如构建仪表盘的功能。
我个人认为将 ELK 中的 L 理解为日志代理(Logging Agent)更为合适。Elasticsearch 和 Kibana 基本上就是存储、检索和分析日志的标准方案,而 Logstash 并不是唯一的日志收集方案,Fluentd 和 Filebeat 也可用于收集日志。因此,现在网络上出现了 ELK、EFK 等缩写。
一般采用的架构如下图所示。通常一个小型集群有三个节点,在这三个节点上可能会运行几十个甚至上百个容器。我们只需要在每个节点上启动一个日志代理实例(在 Kubernetes 中即为 DaemonSet 的概念),就能完成日志的收集。

Filebeat、Logstash、Fluentd三者的区别和联系
这里有必要对 Filebeat、Logstash 和 Fluentd 三者之间的联系和区别进行简要说明。
- Filebeat是一种轻量级的本地日志数据收集方案,官方对 Filebeat 的说明如下。可以看出,Filebeat 的功能相对较简单,它只能收集本地日志,但无法对收集到的日志进行处理,因此通常需要将收集到的日志发送到 Logstash 进行进一步处理。
- Filebeat是一种用于本地文件的日志数据传输器。作为服务器上的一个代理,Filebeat 监视日志目录或特定日志文件,尾随文件,并将其转发到 Elasticsearch 或 Logstash 进行索引。
- Logstash和- Fluentd都具备收集和处理日志的能力。网上有很多关于二者的对比文章,提供一个比较好的文章链接如下。从功能上看,二者基本上相当,但 Logstash 占用更多内存。对此,Logstash 的解决方案是使用 Filebeat 从各个叶子节点收集日志,而 Fluentd 也有对应的 Fluent Bit。
https://logz.io/blog/fluentd-Logstash/
另一个重要区别是 Fluentd 更好地抽象化,为用户隐藏了底层的繁琐细节。作者原话如下:
Fluentd 的方法更加声明式,而 Logstash 的方法更加过程式。对于习惯于过程式编程的程序员来说,Logstash 的配置可能更容易入门。另一方面,Fluentd 的基于标签的路由允许以清晰的方式表达复杂的路由。
虽然作者声称要对比 Logstash 和 Fluentd 时中立对待,但实际上明显偏向 Fluentd。本文也主要基于 Fluentd 进行介绍,但总体思路是相通的。
另外需要提及的是,Filebeat 、Logstash 、Elasticsearch 和 Kibana 都属于同一家公司的开源项目。官方文档如下:
https://www.elastic.co/guide/index.html
而 Fluentd 是另一家公司的开源项目,官方文档如下:
关于ELK
ELK简介
ELK 是 Elastic 公司提供的一套完整的日志收集和展示解决方案,它是三个产品的首字母缩写,分别是 Elasticsearch、Logstash和Kibana。

- Elasticsearch是实时全文搜索和分析引擎,提供数据的收集、分析和存储功能。
- Logstash是用于收集、分析和过滤日志的工具。
- Kibana是基于 Web 的图形界面,用于搜索、分析和可视化存储在 Elasticsearch 指标中的日志数据。
ELK日志处理流程

上图展示了在 Docker 环境下,一个典型的 ELK 方案下的日志收集处理流程:
- Logstash从各个 Docker 容器中提取日志信息。
- Logstash将日志转发到 Elasticsearch 进行索引和保存。
- Kibana负责分析和可视化日志信息。
由于 Logstash 在数据收集方面表现不佳,并且作为代理,其性能不达标。基于此,Elastic 发布了 Beats 系列轻量级采集组件。

这里我们要使用的 Beat 组件是 Filebeat。Filebeat 是构建在 Beats 之上的日志收集方案,适用于日志收集场景,用来替代 Logstash Forwarder,是一种更快速、稳定、轻量、低耗的收集工具。它可以与 Logstash 以及 Elasticsearch 直接对接。
结语
在本次实验中,我们直接使用 Filebeat 作为代理,将收集我在 ECS 中部署服务的日志变道。因此,处理流程如下图所示,你也可以称之为 EFK。
