logstash multi pipeline的使用(二)
默认logstash只有一个管道,当conf.d下有多个配置文件时,其实走的都是一个管道,针对不同业务场景,需要配置不同管道进行数据流通。
在同一个 logstash 实例中,使用多个 pipeline,每个 pipeline 处理不同的 input
,filter
和out
。即配置分散在多个配置文件中。
https://www.jianshu.com/p/9da006b4bec4
1、编写 pipeline 文件
1、从文件收集,输出到控制台
vim file-pipeline.conf
input { file { path => ["/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/multi-pipeline/file-pipeline.log"] start_position => "end" sincedb_path => "/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/multi-pipeline/sincedb.db" sincedb_write_interval => "15 seconds" mode => "tail" type => "file-pipeline" } } filter { } output { stdout { codec => rubydebug { metadata => true } } }
2、从socket收集,输出到控制台
vim tcp-pipeline.conf
# 开启一个tcp监听在9092端口 # id 的值建议设置成唯一的值,这在多个tcp input时,使用监控api时非常有用的。 input { tcp { port => 9202 host => "127.0.0.1" mode => "server" type => "tcp-pipeline" id => "console-tcp" } } filter { } output { stdout { codec => line { charset => "UTF-8" } } }
注意⚠️:
1、tcp 中的 id
的值建议设置成一个唯一的值,这个当我们有多个 tcp
输入时,在我们使用监控api会非常有用。
2、修改 pipelines.yml 配置文件
vim LS_HOME/config/pipelines.yml
- pipeline.id: file-pipeline path.config: "/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/multi-pipeline/file-pipeline.conf" - pipeline.id: tcp-pipeline queue.type: persisted path.config: "/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/multi-pipeline/tcp-pipeline.conf"
注意⚠️:
1、如果上方的配置文件使用的是一个 pipeline
,比如删除下方的 tcp-pipeline,将 file-pipeline的 path.config 的值修改成 .../*.conf
,
那么此时会共用 output
,会发现数据重复。不清楚的可以看博客logstash multi pipeline的使用(一)
即修改成:
# 这样是多个配置文件共用一个 pipeline,filter\output等会共享。 - pipeline.id: file-pipeline path.config: "/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/multi-pipeline/*.conf"
3、启动logstash
注意⚠️:
1、此处的启动命令后不可跟 -e
或-f
,如果跟了,则不会使用默认的 config/pipelines.yml
。

https://blog.csdn.net/weixin_39574555/article/details/112948934
作为生产者和消费者之间数据流的一个中心组件,需要一个 Logstash 实例负责驱动多个并行事件流的情况。默认情况下,这样的使用场景的配置让人并不太开心,使用者会遭遇所谓的条件地狱(Conditional hell)。因为每个单独的 Logstash 实例默认支持一个管道,该管道由一个输入、若干个过滤器和一个输出组成,如果要处理多个数据流,就要到处使用条件判断。
条件地狱(Conditional hell)
已知的在一个管道中实现多个独立流的方法是使用条件判断。主要方式是在输入部分通过标签标记事件,然后在过滤器中和输出阶段创建条件分支,对贴有不同标签的事件,应用不同的插件集。这种方式虽然可以解决问题,但在实际的使用中却非常的痛苦!下面是一个简单的 demo 片段:
input {
beats { port => 3444 tag => apache }
tcp { port => 4222 tag => firewall }
}
filter {
if "apache" in [tags] {
dissect { ... }
} else if "firewall" in [tags] {
grok { ... }
}
}
output {
if "apache" in [tags] {
elasticsearch { ... }
} else if "firewall" in [tags] {
tcp { ... }
}
}
对应的 Logstash 管道配置已经被条件语句包裹的十分臃肿,而它们的唯一目的是保持流的独立性。
虽然使用条件实现独立的多个流是可行的,但是很容易看出,由于存在单个管道和处理的单个阶段,随着复杂性的增加,配置会变得非常冗长,很难管理。下图展示了包含两个流的简单管道:
不幸的是,这并不是该方案的唯一缺陷。
缺乏拥塞隔离
如果您熟悉 Logstash 的工作原理,就会知道管道的输出部分接收到一批事件,并且在所有事件和完成所有输出之前不会移动到下一批事件。这意味着,对于上面的管道,如果 TCP 套接字目标不可达,Logstash将不会处理其他批次的事件,这也就意味着 Elasticsearch 将不会接收事件,并且会对 TCP 输入和 Beats 输入施加反压力。
不同的数据流需要以不同的方式处理
如果 TCP - > Grok - > TCP 数据流处理大量的小数据,而 Beats -> Dissect -> ES 数据流中的单个数据体积大但是数量少。那么前一个数据流希望有多个 worker 并行并其每一批次处理更多事件,第二个数据流则期望使用少量的 worker 和每批次处理少量的事件。使用单个管道,无法为单个数据流指定独立的管道配置pipeline.batch.size: 125
不同的pipelines设置不同的pipeline.batch.size: 125pipeline.batch.size: 125
queue.type: persisted
path.config: "/path/to/config/apache.cfg"
queue.page_capacity: 50mb
- pipeline.id: test
pipeline.batch.size: 2
pipeline.batch.delay: 1
queue.type: memory
config.string: "input { tcp { port => 3333 } } output { stdout {} }"
这个 YAML 文件包含一个散列(或字典)列表,其中每个散列表示一个管道,键和值为该管道设置名称。被省略的设置值返回到它们的默认值。
配置多个管道
下面来看一个真实点的例子,笔者在 Ubuntu 18.04 Server 中安装了 Logstash 6.2.4,除了在默认的配置文件目录(/etc/logstash/conf.d)中添加配置文件外,创建新的目录 /etc/logstash/myconf.d,并在 /etc/logstash/myconf.d 目录下创建 Logstash 配置文件 krtest.conf。然后在 /etc/logstash/pipelines.yml 文件中添加新的 pipeline 配置:
- pipeline.id: main
path.config: "/etc/logstash/conf.d/*.conf"
- pipeline.id: krtest
path.config: "/etc/logstash/myconf.d/krtest.conf"
其中 pipeline.id 为 main 的管道是默认的配置,我们新添加了 id 为 krtest 的管道并指定了对应的配置文件路径。启动 Logstash,如果你安装的 X-Pack 插件就可以在 Kibana->Monitoring->Logstash 中看到新添加的名称为 krtest 的管道:
使用 Multiple Pipelines 后,我们的 Logstash 配置文件就可以写得像下面的代码一样简练(不再需要那么多的条件语句)了:
input {
beats {
port => 5064
}
}
filter {
grok { ... }
}
output {
elasticsearch { ... }
}
注意:当我们配置pipelines.yml后,我们启动不需要再指定配置文件!
————————————————
3.2 多管道配置
在上一节单管道配置的基础上,现在可以实现单个 Logstash 实例运行多个管道,其中每个管道的配置跟上述单管道一致,这里就不再赘述,主要讲讲多管道的几种模式。
官方在 6.0 版本时推出了 multiple-pipelines 的功能,让 Logstash 能在一个实例内同时启动多个管道;之后又在 6.3 版本时推出了 pipeline-to-pipeline 的功能,让同一个 Logstash 实例内的不同管道间可以产生逻辑关系。
注意,多管道的使用必须使用 pipelines.yml 文件,这个配置文件中的配置有两点要注意,首先要指定不重复的 pipeline.id ,其次要说明每个管道的插件配置,可以使用 path.config 指定插件配置文件的路径,也可以使用 config.string 直接把插件的配置写在该 pipelines.yml 文件中。而其余的配置,都跟 logstash.yml 中一样。
同时,启动 Logstash 时不再需要使用 -f 参数指定专门的配置文件,它会默认使用 pipelines.yml 的配置启动。
https://www.pc-daily.com/wangluo/74878.html
https://www.jianshu.com/p/4f44a75ba91d
输入和输出支持编解码器,使您可以在数据进入或退出管道时对其进行编码或解码,而不必使用单独的过滤器。如:json、multiline等

inputs(输入阶段)
会生成事件。包括:file、kafka、beats等
filters(过滤器阶段)
可以将过滤器和条件语句结合使用对事件进行处理。包括:grok、mutate等
outputs(输出阶段)
将事件数据发送到特定的目的地,完成了所以输出处理,改事件就完成了执行。如:elasticsearch、file等
Codecs(解码器)
基本上是流过滤器,作为输入和输出的一部分进行操作,可以轻松地将消息的传输与序列化过程分开。
1. 工作原理
Logstash管道中每个输入阶段都运行在自己的线程中,输入将事件写入到内存或磁盘的中央队列。每个管道工作线程(pipeline worker)从队列中获取一批事件,通过配置的过滤器运行这批事件,然后将过滤的事件运行到所有输出。批处理的大小和工作线程数可以通过pipeline.batch.size和pipeline.workers进行配置。
默认Logstash在管道各阶段之间使用内存队列来缓存事件,如果发生意外的终止,则内存中的事件都将丢失。为了防止数据丢失,可以启用Logstash配置queue.type: persisted将正在运行的事件持久保存到磁盘。
多个管道的配置说明如下:
如果想在一个 Logstash 中启动多个管道,让它们各自运行,互不影响,在 6.0 版本后已经可以实现。
官方文档给的一份示例配置如下:
- pipeline.id: my-pipeline_1 path.config: "/etc/path/to/p1.config" pipeline.workers: 3 - pipeline.id: my-other-pipeline path.config: "/etc/different/path/p2.cfg" queue.type: persisted
它使用插件配置文件 p1.config 启动了一个叫 my-pipeline_1 的管道,又设置这个管道的工作线程为 3 个;而同时又使用 p2.cfg 启动了一个叫 my-other-pipeline 的管道,设置这个管道的队列为持久化管道。
此外logstash还有其他管道的使用类型的说明
等等
posted on 2022-09-25 21:56 luzhouxiaoshuai 阅读(1395) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2021-09-25 图灵学院skywalking的学习