Filebeat 和 Logstash 均由 Elastic 开发,是 Elastic Stack 不可或缺的组件,它们都充当日志收集器,具有不同的特性和功能。Logstash 是 ELK Stack(Elasticsearch、Logstash、Kibana)的原始组件,旨在高效地从多个来源收集大量日志并将其分发到不同的目的地。
虽然 Logstash 越来越受欢迎,但由于资源密集型操作,尤其是在资源有限的系统上,它面临着挑战。为了解决这个问题,Elastic 推出了 Filebeat 作为 Beats 系列的一部分,为 Logstash 提供了轻量级的替代品。这一新增导致 ELK Stack 更名为 Elastic Stack,以更好地涵盖包括 Beats 在内的不断增长的工具套件。Filebeat 旨在补充 Logstash,但随着时间的推移演变成一个独立的日志收集器。
因此,鉴于这两个日志收集器的独特优势和功能,在这两个日志收集器之间做出决定可能是一项艰巨的任务。本文将比较 Filebeat 和 Logstash,探讨它们的优缺点,并提供有关何时选择其中一种的见解。
什么是 Filebeat?
Filebeat 是由 Elastic 开发的免费开源日志收集器,是 Elastic Stack 中 beats 系列的一部分。这套工具对于收集和传送各种类型的数据(如日志、指标和网络信息)至关重要。Filebeat 最初主要设计用于 Logstash,但随着时间的推移,随着 Elastic 对其日志处理能力的不断更新,Filebeat 已经超越了这一点。
此外,Filebeat 具有各种内置输入和输出,可满足不同的来源和目标。如果这些内置选项不符合特定要求,它还允许创建自定义插件。Filebeat 还包括内部模块,用于从广泛使用的工具(如 NGINX、Apache、系统日志和 MySQL)收集和解析日志。
Filebeat 因其轻量级设计、可靠性和稳健性而受到重视。它支持加密数据传输,并使用背压敏感协议,这在处理大量数据时很有用。此功能使其能够调整其数据传输速率,防止目的地过载。
什么是 Logstash?
Logstash 是由 Elastic 创建的免费开源数据管道工具。它旨在有效地收集、处理日志并将其发送到各种目标。Logstash 以其灵活性而闻名,提供多个输入、过滤器和输出,使其能够适应不同的日志处理需求。它擅长过滤、解析和转换日志,提供高级日志处理能力。
作为 Elastic Stack 的关键组件,Logstash 可与 Beats、Elasticsearch 和 Kibana 等其他工具无缝协作。它从各种来源提取数据并将其推送到 Elasticsearch,然后转发到 Kibana 进行分析和可视化。
Logstash 拥有超过 200 个插件,并提供了一个 API,用于创建满足特定用户需求的自定义插件。Logstash 的一个显著特点是其可靠性,它由一个持久队列支撑,该队列在传输日志事件时保存日志事件。在事件发送失败的情况下,Logstash 可以将其重新路由到另一个队列进行进一步检查和重新处理。
现在我们已经对 Filebeat 和 Logstash 有了基本的了解,让我们来比较一下这两个工具。我们的比较将重点关注以下关键标准:
特征 | Filebeat | Logstash |
---|---|---|
支持的平台 | 跨平台 | 跨平台 |
内存使用率/性能 | 轻量级 | 利用大量内存 |
生态系统和插件 | 少于 60 个插件 | 超过 200 个插件 |
日志解析 | 具有内置解析器和模块 | 具有更强大的解析器 |
事件路由 | 不支持 | 使用条件语句路由日志 |
传输 | 缓冲日志事件并具有持久性队列 | 缓冲日志事件并具有持久性队列 |
UI & UX | 没有 UI,但可以与 Kibana 集成 | 没有 UI,但可以与 Kibana 集成 |
1. 支持的平台
Filebeat 是使用 Go 开发的,Go 是一种以创建高性能网络和基础设施程序而闻名的现代语言。其设计允许 Filebeat 以较低的内存占用量收集、处理和转发日志。此外,它的兼容性跨越各种平台,包括 Linux、Windows、MacOS,甚至容器化环境。
另一方面,Logstash 是使用 JRuby 构建的,JRuby 是 Java 中 Ruby 编程语言的高性能实现。要运行 Logstash,需要 Java 虚拟机 (JVM)。JVM 的跨平台兼容性确保 Logstash 可以在各种系统上运行,包括 Linux、Windows 和 MacOS。这使得 Logstash 在平台支持方面同样通用。
考虑到支持的平台,Filebeat 和 Logstash 都表现出很强的适应性,使其成为跨平台支持的绝佳选择。
2. 内存使用率/性能:Filebeat 获胜
Filebeat 旨在专注于轻量级效率,使其能够处理大量数据,同时保持最小的内存消耗。Filebeat 的单个实例通常使用不到 2MB 的内存,并使用不到 30% 的 CPU。如前所述,这种非凡的效率主要归功于它在 Go 中的发展。
此外,Filebeat 还具有负载平衡和故障转移功能,这对于确保一致的日志数据检索和转发至关重要,尤其是在高流量场景中。
相比之下,Logstash 需要的内存占用要高得多。根据官方文档,为了有效运行,它需要一个至少具有 2GB 内存的主机,建议的内存分配约为 4GB。这种需求的增加源于 Logstash 对 Java 虚拟机 (JVM) 及其复杂的日志处理功能的依赖,这自然会消耗更多的资源。虽然 Logstash 确实包含负载平衡和故障转移功能以实现可靠的日志处理,但其较高的资源要求使其不太适合内存和 CPU 使用率是关键限制的环境。
总之,对于性能和可扩展性至关重要且内存使用率至关重要的环境,Filebeat 是更有利的选择,因为它具有更低的内存占用和高效的资源利用率。
3. 生态系统和插件:Logstash 获胜
Filebeat 专注于轻量级和高效,仍然提供包含 60 多个插件的大量库。这些插件涵盖了各种输入和输出,包括 AWS S3、Kafka、Redis 和 File。这些插件的全面详细信息可以在文档中的详细输入和输出页面上找到。对于那些熟练使用 Go 的人来说,Filebeat 还允许创建自定义插件,为特定用例提供灵活性。此外,Filebeat 的模块简化了从 MySQL 或 Nginx 等流行工具读取日志的过程,增强了其易用性。
另一方面,Logstash 拥有丰富的插件生态系统,数量超过 200 个,分为输入、输出、过滤器和编解码器。这些插件大多是内置的,构成了 Logstash 高级日志处理能力的基础。广泛使用的插件包括 Grok 过滤器插件,它使用正则表达式解析日志,以及 GeoIP 过滤器,它为 IP 地址生成地理信息。
为 Logstash 创建自定义插件非常简单,官方文档提供了全面的指导。
由于其广泛的插件生态系统,Logstash 在需要高级数据处理的场景中成为明显的赢家。
4. 日志解析:Logstash 获胜
在日志解析方面,Filebeat 和 Logstash 都展示了高级日志解析功能,集成了能够处理结构化和非结构化日志的内置插件。
Filebeat 通过使用可用的处理器增强了其解析功能,能够解析 JSON 和 CSV 等标准格式。此外,内部模块使 Filebeat 能够解析来自 Nginx、MySQL 或 Apache 等来源的流行格式。
同样,Logstash 提供了强大的解析器和内置功能。Logstash 的与众不同之处在于包含 Grok,它使用正则表达式将日志事件与特定模式进行匹配。Grok 具有 200 多种预定义模式,能够解析来自不同来源(如 MongoDB、Postgres 和 AWS)的结构化和非结构化日志,并灵活地定义用于解析自定义日志格式的模式。
在日志解析方面,Filebeat 适合处理标准日志格式,而 Logstash 则凭借强大的解析功能脱颖而出。
5. 事件路由:Logstash 获胜
事件路由是一个过程,其中日志事件根据条件或每个日志事件中的内容定向到特定目标。这意味着您可以设置规则,根据每个日志包含的数据确定应将每个日志发送到何处。例如,您可以将日志收集器配置为将 HTTP 状态代码为 200 的所有日志事件发送到远程位置,而将状态代码为 400 的日志事件写入特定文件。
Filebeat 虽然在日志收集方面很高效,但并非设计为事件路由。它通常会将所有收集的日志转发到单个端点(通常是 Logstash),这与其原始设计目的一致。因此,在需要将日志从多个来源分发到不同目标的场景中,Filebeat 的功能会受到限制。
另一方面,Logstash
在事件路由方面表现出卓越的熟练程度。它支持使用条件语句(如
if-then-else
)将日志事件路由到多个目标。这些条件允许
Logstash 根据特定条件评估日志事件并相应地指导它们。
鉴于事件路由在根据特定需求定制日志分发方面的重要性,Logstash 在这方面的表现优于 Filebeat。
6. 传输
在传输数据方面,Filebeat 和 Logstash 不相上下,它们都提供有效的输出插件,用于从各种来源收集日志并将其传送到多个目的地,包括云存储、Kafka、AWS 和本地文件。
这两种工具的一个关键特性是它们使用内存中队列来缓冲日志事件。此功能对于管理日志数据中的峰值和临时存储日志以防止数据输出过载至关重要。内存中队列在重新发送可能由于输出目标问题而无法传输的日志事件方面也发挥着作用。
在意外中断或过早退出时,存在丢失存储在这些内存中队列中的日志事件的风险。但是,Filebeat 和 Logstash 通过提供为持久性数据存储配置磁盘队列的选项来降低这种风险。这种额外的弹性层确保了工具可以无缝地恢复其操作,在突然关闭时从中断的地方继续运行。
需要注意的是,尽管 Logstash 和 Filebeat 具有持久队列,但偶尔会发生故障,尤其是在处理大量数据时。为了缓解这种情况,建议使用专用工具(如 Kafka)从日志收集器中卸载负载。该工具充当临时数据持久层,为日志管理基础结构增加了额外的弹性和稳定性。
考虑到它们在数据传输方面的能力,Filebeat 和 Logstash 都比对方具有明显的优势。两者都可以可靠地传输和持久化数据。
什么时候应该使用 Filebeat 或 Logstash ?
在 Filebeat 和 Logstash 之间做出决定取决于您的特定日志管理需求。
当您的主要需求是从各种来源收集日志并将其定向到 Elasticsearch 或云存储等单一目标时,Filebeat 是一个理想的选择。其他理想的情况是,您的日志需要基本解析,例如处理 Nginx 日志或管理不需要复杂处理的 syslog 输入。
另一方面,如果您正在处理需要复杂操作、扩充或过滤的半结构化或非结构化日志,那么 Logstash 更合适。当您的目标是将日志事件路由到多个目标时,它也是首选工具。
更有效的策略是结合使用 Filebeat 和 Logstash,特别是用于管理来自不同来源的日志。通常,由于 Filebeat 的效率,您可以使用 Filebeat 来收集日志。然后,收集的日志将转发到 Logstash 进行更复杂的处理。Logstash 可以配置为将日志分发到不同的目的地,或者将它们转发到 Elasticsearch 进行索引,然后转发到 Kibana 进行可视化。这种组合方法有效地利用了 Filebeat 和 Logstash 的优势。
有关更具可伸缩性的设置,请参阅下图:
实例
让我们看一个使用 Elastic Stack 的实际示例,并考虑 Filebeat 和 Logstash 如何协同工作来管理和处理日志。
假设您有以下格式的 Nginx 日志:
1 | 203.0.113.1 - - [14/Jan/2022:08:30:45 +0000] "GET /example-page HTTP/1.1" 200 1024 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" |
以下是使用 Filebeat 和 Logstash 处理这些日志的方法:
- 使用 Filebeat:首先,使用 Filebeat 从 Nginx 收集日志。Filebeat 可以配置 Nginx 模块,该模块旨在解析 Nginx 日志。
- 转发到 Logstash:收集和初始解析后,配置 Filebeat 将这些日志发送到 Logstash。
- 在 Logstash 中处理:在 Logstash 中,您可以对日志进行高级操作。这包括提取特定字段、设置日期格式、编辑 IP 地址、重命名字段和其他所需的转换。
- 发送到 Elasticsearch 和 Kibana:处理完成后,Logstash 会将日志转发到 Elasticsearch 进行索引。索引后,可以在 Kibana 中对数据进行可视化和分析。
此工作流程演示了 Filebeat 和 Logstash 如何无缝协作。此设置对于处理需要简单和复杂处理和可视化过程的日志非常方便。
结论
在本文中,我们比较了 Filebeat 和 Logstash,展示了每种工具如何满足不同的需求。
Filebeat 是一个轻量级选项,非常适合资源有限且需要基本日志解析的环境。相反,Logstash 是为需要高级日志处理的场景量身定制的。
同时使用这两种工具也可以具有战略意义,以获得两全其美的优势。使用 Filebeat 收集日志并将其转发到 Logstash 进行高级转换提供了一种平衡的方法。