Logstash 重复事件
Logstash Duplicate Events
我有两个 Logstash 配置文件:test1.conf
和 test2.conf
。
他们每个人都有自己的 input -> filter -> ouput
流量。
它们都有相同的过滤器,elasticsearch
输出写入相同的索引。
我的问题是,无论我选择测试哪个输入,Logstash 都会将重复的事件写入 ElasticSearch 索引(每个事件变成两个相同的事件,而不是一个)。
我该如何解决这个问题?
默认情况下,Logstash 有一个名为 main
的管道,它会自动检测 conf.d[=82= 中的所有 .conf 文件] 文件夹;此配置设置在 pipelines.yml 文件:
- pipeline.id: main
path.config: "/etc/logstash/conf.d/*.conf"
如果在一个管道下有多个 .conf 文件,Logstash 会将它们合并在一起,导致对所有输入执行所有过滤器和输出,因此在这种情况下,无论哪个输入正在接收事件,它都会通过 filter/output 的两条路径,导致重复写入 ElasticSearch(如果 filters/outputs 与 .conf[ 相同,则事件相同=82=] 个文件)。
解决方案
1.将 filter/output 移动到单独的文件中
如果您的 filters/outputs 在所有配置文件中都相同,请将 filter/output 移动到一个单独的文件中。所以现在你有两个 .conf 文件,一个用于每个输入,第三个 .conf 文件用于 filter/output。使用此设置,每个输入都将只经过一个处理路径。
例如:
input1.conf
input {
# input 1
}
input2.conf
input {
# input 2
}
filter_output.conf
filter {
# common filter
}
output {
# common output
}
您可以查看此 以获取应选择此解决方案的另一个示例。
请注意,如果 filters/output 相同但您仍希望将它们称为完全不同的处理路径,请继续阅读。
2。将 .conf 文件拆分到不同的管道
如果您需要每个 .conf 文件都是独立的,请将 .conf 文件拆分到不同的管道。
为此,只需编辑 pipelines.yml
文件。
例如:
pipelines.yml
- pipeline.id: test1
path.config: "/etc/logstash/conf.d/test1.conf"
- pipeline.id: test2
path.config: "/etc/logstash/conf.d/test2.conf"
阅读更多关于 Multiple Pipelines
3。按类型分开
用不同的类型标记每个输入,稍后在 filters/outputs 上用 if 语句检查它。
您可以在此 answer 中阅读更多相关信息。
我有两个 Logstash 配置文件:test1.conf
和 test2.conf
。
他们每个人都有自己的 input -> filter -> ouput
流量。
它们都有相同的过滤器,elasticsearch
输出写入相同的索引。
我的问题是,无论我选择测试哪个输入,Logstash 都会将重复的事件写入 ElasticSearch 索引(每个事件变成两个相同的事件,而不是一个)。
我该如何解决这个问题?
默认情况下,Logstash 有一个名为 main
的管道,它会自动检测 conf.d[=82= 中的所有 .conf 文件] 文件夹;此配置设置在 pipelines.yml 文件:
- pipeline.id: main
path.config: "/etc/logstash/conf.d/*.conf"
如果在一个管道下有多个 .conf 文件,Logstash 会将它们合并在一起,导致对所有输入执行所有过滤器和输出,因此在这种情况下,无论哪个输入正在接收事件,它都会通过 filter/output 的两条路径,导致重复写入 ElasticSearch(如果 filters/outputs 与 .conf[ 相同,则事件相同=82=] 个文件)。
解决方案
1.将 filter/output 移动到单独的文件中
如果您的 filters/outputs 在所有配置文件中都相同,请将 filter/output 移动到一个单独的文件中。所以现在你有两个 .conf 文件,一个用于每个输入,第三个 .conf 文件用于 filter/output。使用此设置,每个输入都将只经过一个处理路径。
例如:
input1.conf
input {
# input 1
}
input2.conf
input {
# input 2
}
filter_output.conf
filter {
# common filter
}
output {
# common output
}
您可以查看此
请注意,如果 filters/output 相同但您仍希望将它们称为完全不同的处理路径,请继续阅读。
2。将 .conf 文件拆分到不同的管道
如果您需要每个 .conf 文件都是独立的,请将 .conf 文件拆分到不同的管道。
为此,只需编辑 pipelines.yml
文件。
例如:
pipelines.yml
- pipeline.id: test1
path.config: "/etc/logstash/conf.d/test1.conf"
- pipeline.id: test2
path.config: "/etc/logstash/conf.d/test2.conf"
阅读更多关于 Multiple Pipelines
3。按类型分开
用不同的类型标记每个输入,稍后在 filters/outputs 上用 if 语句检查它。
您可以在此 answer 中阅读更多相关信息。