elasticsearch - Logstash 重复事件
问题描述
我有两个 Logstash 配置文件:test1.conf
和test2.conf
.
他们每个人都有自己的流量input -> filter -> ouput
。
它们都具有相同的过滤器和elasticsearch
输出写入相同的索引。
我的问题是 Logstash 正在将重复事件写入 ElasticSearch 索引,无论我选择测试哪个输入(每个事件都变成两个相同的事件而不是一个)。
我怎样才能解决这个问题?
解决方案
默认情况下,Logstash 有一个名为的管道main
,它会自动检测conf.d文件夹中的所有.conf文件;此配置在pipelines.yml文件中设置:
- pipeline.id: main
path.config: "/etc/logstash/conf.d/*.conf"
如果你在一个管道下有多个.conf文件,Logstash 会将它们合并在一起,导致对所有输入执行所有过滤器和输出,因此在这种情况下,无论哪个输入接收事件,它都会经过两条路径过滤器/输出,导致重复写入 ElasticSearch(如果两个.conf文件的过滤器/输出相同,则会发生相同的事件)。
解决方案
1.将过滤器/输出移动到单独的文件中
如果您的过滤器/输出在配置文件中相同,请将过滤器/输出移动到单独的文件中。所以现在你有两个.conf文件,一个用于每个输入,第三个.conf文件用于过滤器/输出。使用此设置,每个输入将仅通过一个处理路径。
例如:
input1.conf
input {
# input 1
}
input2.conf
input {
# input 2
}
filter_output.conf
filter {
# common filter
}
output {
# common 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"
阅读有关多管道的更多信息
3. 按类型分隔
用不同的类型标记每个输入,稍后使用 if 语句在过滤器/输出上检查它。
您可以在此答案中阅读更多相关信息。
推荐阅读
- javascript - 用于拖放元素的垃圾箱
- python - Python:拆分字符串,使每个子字符串都是字典中的键
- virtualenv - 从 Singularity 容器访问主机 Python 虚拟环境
- mysql - 击球率最高的前 10 名球员名单
- julia - 获取 OffsetArray 的左上角索引
- python - 为每一对计算 pandas 中两列之间的相关性
- mongodb - mongodb使用find(不是聚合)只获取一个嵌套子文档
- bash - 如何使用 bash -c 调用 bash 脚本函数
- sql - 有没有一种简单的方法来推断 PostgreSQL upsert 的字段?
- flutter - Flutter - 多个解析实例