现象
问题:配置多个conf后,所有的输入源都输入到所有的输出源中,并且filter中配置单个但是影响全局
Logstash的pipeline配置了多个个conf,也就是多个输入源。如果不做任何处理,那么所有的Filter,Output都会同时触发,如下图:
这显然跟我们期望的不同,我们希望Logstash有全局处理和单个conf配置处理,尤其是输出管道。按以下的方式来处理,也就是各自区分,独立处理:
解决方案
官方提供有 type 和tags 配置项进行区分,type 和 tags 是 logstash 事件中两个特殊的字段。
通常来说我们会在输入区段中通过 type 来标记事件类型 —— 我们肯定是提前能知道这个事件属于什么类型的。而tags 则是在数据处理过程中,由具体的插件来添加或者删除的。
type类型区分
我们看一个样例:输入源是日志文件
input {
file {
#标签
type => "common-rest"
#采集点
path => "/data/logs/common-rest/*.log"
#开始收集点
start_position => "beginning"
#扫描间隔时间,默认是1s,建议5s
stat_interval => "5"
}
}
#filter {
# mutate {
# remove_field => ["host","_index","type","_id","_type","@version","path","_score"]
# }
#}
filter {
if [message] == "" or [message] == "\r"{
drop{}
}
}
output {
#判断输入源类型
if [type]=="common-rest" {
elasticsearch {
hosts => ["10.255.20.231:9200"]
index => "common-rest"
#index => "common-rest-%{+YYYY.MM.dd}"
}
}
}
当然,filter是同样的道理
tags区分
input {
file {
#标签
#type => "common-rest"
#采集点
path => "/data/logs/common-rest/*.log"
#开始收集点
start_position => "beginning"
#扫描间隔时间,默认是1s,建议5s
stat_interval => "5"
tags =>"common-rest"
}
}
#filter {
# mutate {
# remove_field => ["host","_index","type","_id","_type","@version","path","_score"]
# }
#}
filter {
if [message] == "" or [message] == "\r"{
drop{}
}
}
output {
#判断输入源tags
#if [type]=="common-rest" {
if "common-rest" in [tags] {
elasticsearch {
hosts => ["10.255.20.231:9200"]
index => "common-rest"
#index => "common-rest-%{+YYYY.MM.dd}"
}
}
}
总结
过以上方式配置,就能将pipeline各自区分开。大家可以试下,如果把type参数去掉,最后的elasticsearch数据会混或者数据重复等奇怪问题
原因
logstash启动后会把多个配置文件自动合并成一个,比如有两个conf文件,每个都有 filter、ouput,写入一条数据,会执行两次filter和output,重复写入
外传
😜 原创不易,如若本文能够帮助到您的同学
🎉 支持我:关注我+点赞👍+收藏⭐️
📝 留言:探讨问题,看到立马回复
💬 格言:己所不欲勿施于人 扬帆起航、游历人生、永不言弃!🔥