深入 Logstash 17 - Logstash 的演进与 Elastic Agent 的冲击
上一篇把 Logstash 和 Fluentd、Vector 放在一起横向对比。这一篇转向纵向:Logstash 自 2009 年诞生以来历经哪些关键演进,Elastic Agent 和 OpenTelemetry Collector 的出现又如何重新划定了它的边界。
核心问题:持久队列、DLQ、pipeline-to-pipeline 一路补齐的是什么——当 Elastic Agent 分走了边缘采集场景、OTel 提供了厂商中立的替代方案,Logstash 今天的定位是什么。
本篇的版本坐标截至 2026-08:Logstash 的最新发布版本是 9.5.2,8.19 分支仍在维护。下面时间线里每一行的版本归属,取自官方 release notes 的原文,或该功能文档在各发布分支上的首次出现;发布日期取自对应 tag 的提交时间。全系列统一的版本前提见第 01 篇。
演进时间线
1 | |
每个版本的变化都在解决一个具体的可靠性或运维痛点,而不是纯粹的功能堆砌。值得注意的是几处常被记错的边界:PQ 的引入与转正差了三个小版本,DLQ 比多管道更早,Java 执行引擎从可用到成为默认跨了三年、到彻底移除 Ruby 引擎又是三年。
各阶段解决了什么
1.x–2.x:能用,但脆
内存队列意味着进程崩溃丢数据;单管道意味着所有 input/filter/output 共享同一条链,互相影响;Ruby 实现使得性能上限低,大流量下 GC 停顿明显。这个阶段的 Logstash 适合原型和小流量场景,不适合生产级别的高可靠需求。
5.x:两条兜底路径落地
PQ 把队列从内存移到磁盘,引入检查点机制,崩溃重启后从检查点恢复,把可靠性从"尽力而为"提升到 at-least-once(在源可重放的前提下)。它在 5.1 带着 beta 警告进来,5.4 才转正,这三个小版本的间隔说明落盘队列的正确性不是一次就做对的。紧接着 5.5 的 DLQ 补上另一条路径:解析失败的事件不再直接丢弃或让整条管道卡住,而是写入独立的死信队列文件,允许事后检查和重放修复。这两件事一起把 Logstash 从"玩具"推到了"可信赖生产组件"。
6.x–7.x:结构解耦与执行引擎换代
6.0 的 pipelines.yml 让不同数据流能隔离运行,解决了大型部署里"一个慢 pipeline 拖死全局"的问题。6.3 引入的 pipeline-to-pipeline 让多个逻辑管道可以用 pipeline input/output 互相传递事件、形成有向图,不必每条管道都独立从源读到目标写;它同样走了一段 beta,7.4 才转 GA。同期 Java 执行引擎分三步换代:6.1 需要命令行开关才能试用,6.5 转 beta,7.0 成为默认。这一步把 filter 和 output 的执行从 JRuby 解释器切换到 Java 原生实现。
8.x–9.x:清掉历史包袱,补上可观测性
8.0 移除了 Ruby 执行引擎,核心执行路径上不再有两套实现并存——这是 7.0 换默认三年之后的收尾动作,而不是换默认本身。8.5 起 flow metrics 进入 Node Stats API,把每秒事件数、队列增长速率这类运行时速率做成了现成字段,不必再自己对累计值做差,这是第 13 篇判读主线的由来。9.x 继续在边角收紧:9.2 给 PQ 加上 ZSTD 压缩,9.4 补了管道崩溃自动恢复与 batch 直方图指标,9.5 让 Logstash 能把自己的运行指标通过 OTLP 导出。
Elastic Agent 的出现
Elastic Agent 是 Elastic 在 7.9 版本引入、8.x 版本全面推广的新一代统一代理:
1 | |
Elastic Agent 把 Filebeat、Metricbeat、Auditbeat、Elastic Endpoint 等多个 Beats 合并到单一进程里,由 Fleet 服务器统一管理配置和升级。对运维人员而言,不再需要在每台机器上分别配置和维护多个 Beats 进程;对开发人员而言,集成模块(integration)提供了预打包的字段映射、Ingest Pipeline 和 Kibana 仪表板,开箱即用。
Elastic Agent 直连 ES + Ingest Pipeline,绕过了 Logstash 在边缘采集和简单解析场景中的位置。
Elastic Agent 带走了什么
Elastic Agent 把以下场景从 Logstash 典型用例中分走:
1 | |
简单来说:当目的地是 Elasticsearch、变换逻辑不超过 Ingest Pipeline 能力范围、且不需要写多个目标时,Elastic Agent 提供了比 Beats → Logstash → ES 更低的运维复杂度。
Logstash 保留了什么
Elastic Agent 冲击之后,Logstash 的核心价值集中在三类场景:
1 | |
一条简洁的判断规则:如果数据源、变换逻辑、目标都在 Elastic 生态内,且变换不超过 Ingest Pipeline 能力,用 Elastic Agent;只要有一项超出,就需要评估是否引入 Logstash。
OpenTelemetry Collector 的角色
OpenTelemetry(OTel)是 CNCF 的可观测性标准,OTel Collector 是其数据采集和转发组件:
1 | |
OTel Collector 与 Logstash 的定位有重叠:都能接收多种数据源、做变换、发往多种目标。区别在于:OTel Collector 的设计中心是厂商中立的可观测性数据(traces、metrics、logs),其 processor 能力(transformation、filtering)目前比 Logstash 的 filter 生态弱;Logstash 在日志的复杂文本解析上有更成熟的工具。
但两者目前不能直接串联。Logstash 没有 OTLP receiver:logstash-plugins 下不存在对应的 input 插件,8.x 全部 release notes 里也检索不到 OTLP 相关条目。Elastic 在 Logstash 侧对 OTel 的落点是反方向的——9.5 起 Logstash 可以把自己的内部运行指标通过 OTLP 导出到任意兼容后端(otel.metrics.enabled,默认 false,目前是技术预览)。在 OTel 体系里,Logstash 的角色是被观测的遥测数据源,而不是遥测数据的接收端。
要让 OTel Collector 采集的数据流进 Logstash,得走一个中间协议:Collector 用 kafka exporter 写出,Logstash 用 kafka input 读入。这条路能通,但它是两套系统各自对接一个公共队列,不是原生集成。
定位收敛
把演进历程和外部冲击放在一起,Logstash 的定位从"Elastic Stack 的通用数据接入层"收敛到了"复杂转换与多目标路由的中心聚合节点":
1 | |
这是一个在技术生态里反复出现的模式:通用工具在早期覆盖所有场景,随着专用工具成熟,通用工具逐渐退出它并不擅长的简单场景,聚焦在它有独特优势的复杂场景上。这不是工具的衰落,而是职责的收敛。
模式提炼
1 | |
工程迁移表
| Logstash 演进特性 | 解决的问题 | 对应的通用模式 |
|---|---|---|
| 持久队列(5.1 引入,5.4 GA) | 崩溃丢数据 | 持久化消息队列 + 检查点 |
| 死信队列(5.5) | 解析失败事件消失 | Dead Letter Queue / side output |
| 多管道配置(6.0) | 所有数据流共享一条链 | 按业务拆分部署单元 |
| pipeline-to-pipeline(6.3 引入,7.4 GA) | 单管道耦合所有逻辑 | 管道解耦 / 微服务间通信 |
| Java 执行引擎(6.1 可用,7.0 默认,8.0 移除 Ruby) | JRuby 解释器性能瓶颈 | 从解释器迁移到编译执行 |
| flow metrics(8.5) | 运行时状态不可见 | 实时吞吐指标 / RED 方法 |
| Elastic Agent 替代边缘采集 | 运维多 Beats 进程复杂 | 统一代理 / Fleet 管理 |
| OTLP 指标导出(9.5,技术预览) | 运行指标绑死在专有 API 上 | 开放遥测协议 / 监控后端可替换 |
常见误解
误解一:“Elastic Agent 出来之后 Logstash 就没用了”。Elastic Agent 替代的是 Beats 在 Elastic 生态内的边缘采集职责,而不是 Logstash 的复杂变换和多目标路由职责。两者解决的是不同层次的问题,在同一套系统里可以并存。
误解二:“从 Logstash 迁移到 Elastic Agent 不需要改变换逻辑”。迁移时需要把 Logstash filter 逻辑翻译为 Ingest Pipeline processor,这是一次重写,不是配置平移。两者的语法、能力范围和调试方式都不同,迁移成本取决于现有 filter 的复杂程度。
误解三:“OTel Collector 可以直接替换 Logstash”。OTel Collector 的 processor 生态和日志文本解析能力(没有 Grok 等价物)目前不如 Logstash,在需要复杂正则解析非结构化日志的场景下差距明显。两者在 traces/metrics/logs 的标准化采集上有重叠,但在日志复杂处理上不是同等能力的替代。
误解四:“Logstash 的 JRuby 已经完全被移除”。Java 执行引擎替代的是核心 pipeline 的 JRuby 执行路径,Logstash 的插件层(尤其是社区插件)仍然有 Ruby 代码。logstash-core 的主要执行路径已经是 Java,但 Logstash 作为整体仍然依赖 JRuby 运行时来加载和运行 Ruby 插件。
练习
-
查阅 Elastic 官方文档,找到 Elastic Agent 的 integration 列表,选一个你常用的数据源(如 Nginx、PostgreSQL、Kubernetes),对比它在 integration 里预打包的 Ingest Pipeline 处理逻辑和你之前可能用 Logstash 写的等价 filter 配置,记录功能覆盖的差距。
-
阅读 Logstash 的 flow metrics 文档(
/_node/stats/pipelines),找出flow.filter_throughput、flow.queue_backpressure、flow.output_throughput三个指标,解释它们分别反映了管道的哪个阶段的状态,以及如何用它们定位"是 filter 慢还是 output 慢"。 -
思考题:给定一个已有生产 Logstash 集群(接收来自 50 台服务器的 Filebeat,做复杂 Grok 解析,写两个 ES 集群),Elastic 要求你评估是否迁移到 Elastic Agent。写出评估框架:哪些部分可以迁移(边缘采集),哪些必须保留 Logstash(双集群写入、复杂 Grok),以及迁移过程中如何保证不丢数据。
系列导航
参考资料
- Logstash 版本历史与发布说明:https://www.elastic.co/guide/en/logstash/current/releasenotes.html
- Logstash 持久队列文档:https://www.elastic.co/guide/en/logstash/current/persistent-queues.html
- Logstash 死信队列文档:https://www.elastic.co/guide/en/logstash/current/dead-letter-queues.html
- Logstash pipeline-to-pipeline 文档:https://www.elastic.co/guide/en/logstash/current/pipeline-to-pipeline.html
- Elastic Agent 官方文档:https://www.elastic.co/guide/en/fleet/current/elastic-agent-installation.html
- Fleet 和 Elastic Agent 架构:https://www.elastic.co/guide/en/fleet/current/fleet-overview.html
- OpenTelemetry Collector 文档:https://opentelemetry.io/docs/collector/
- Elastic Stack 与 OpenTelemetry 集成:https://www.elastic.co/guide/en/observability/current/open-telemetry.html
- 仓库内《深入 Elasticsearch》系列:数据流、ILM、Ingest Pipeline 的交叉引用
