Logstash 工作原理
Logstash 是如何工作的?
Logstash 事件处理管道拥有三个阶段:输入 → 过滤 → 输出。
输入产生事件,过滤修改事件、输出将修改后的事件输出到任何目的地。输入和输出搜支持编解码器,使您可以在数据出入管道时对其进行编码或解码,而不必再使用单独的过滤器。
Inputs
使用 Input 插件将数据输入至 Logstash 中。
一些常用的 Input 插件有:
- file:从文件系统中的文件读取数据。
- syslog:侦听514端口上的syslog消息并根据RFC3164格式进行解析
- reids:同时使用 redis 通道和 redis 列表从 redis 服务器上读取数据。
- beats:处理通过 Beats 发送的事件。
Filters
过滤器插件是在 Logstash 管道中的中间处理设备。如果事件符合特定的条件,则可以将过滤器与条件结合使用以对事件执行操作。
一些常用的 filters 包括:
- grok:解析和结构化抽象的文本信息。Grok 是目前在 Logstash 中解析非结构化日志数据的最佳方式。其拥有120种内置的解析模式。
- mutate:对事件字段执行转换。可以重命名,删除,代替和修改事件种的字段。
- drop:完全删除事件,例如调试事件。
- clone:对事件进行复制。
- geoip:添加有关IP地址地理位置的信息。
Outputs
输出是 Logstash 管道的最后阶段。一个事件可以通过多个输出进行传递,但一旦所有输出处理都完成了,该事件就完成了全部流程的执行。
一些常用的 outputs 包括:
- elasticsearch:发送事件数据到 ES 中。
- file:将事件数据写入到硬盘中的文件。
- graphite:暂时不知道是什么。
- statsd:也暂时不知道是什么。
Codecs
编解码器是最基本的流过滤器,它可以作为输入或输出的一部分进行操作。编解码器使您可以轻松地将消息的传输与序列化过程分开。
一些常用的编解码器:
- json:以 Json 格式对数据进行编码或解码。
- multiline:合并多行文本事件例如 Java 异常和 stacktrace 消息进单个事件。
Logstash 运作模型
Logstash 事件处理管道协调输入、过滤器和输出的执行。Logstash 管道中的每个输入阶段都在其自己的线程中运行。输入插件写入事件到内存(默认)或硬盘的中央队列中,每个管道工作线程都会从该队列中提取一批事件,通过配置的过滤器运行事件批处理,然后再通过任意输出插件运行过滤后的事件。事件批处理的大小和管道工作线程的数量都是可配置的(Tuning and Profiling Logstash Performance)。
默认情况下,Logstash 在管道各阶段(input → filter and filter → output)之间使用内存中的有界队列来缓冲事件。如果 Logstash 异常终止了,存储在内容中的事件将会丢失。为了防止数据丢失,你可以启用 Logstash 将正在进行的事件持久化到硬盘(Persistent Queues)。
处理细节
清晰的理解 Logstash 是如何工作的,并且组件间是如何相互联系的可以帮助您当您需要设置或者调整 Logstash 环境时更好的做决定。
事件顺序
根据设计和默认情况,Logstash 并不保证事件的顺序。重新排序可以在两个地方进行:
- 批次内的事件可以在过滤器处理期间重新排序。
- 当一个或多个批次的处理速度快于其他批次时,可以对飞行中的批次进行重新排序。
当维护事件顺序很重要时,请使用单个工作进程并设置 pipeline.ordered => true。这种方法可确保批处理是一个接一个的运行的,并且事件在批处理中保持其顺序。
pipeline.ordered setting
在 logstash.yml 文件中的 pipeline.ordered 设置使您可以更好地控制单个工作进程管道地事件顺序。

浙公网安备 33010602011771号