Logstash使用fingerprint插件去重复出现问题

我是新手,可能有些细节描述不清楚,请大家耐心看完。我的测试环境如下:
1)elasticsearch版本2.2.0,安装目录/opt/elasticsearch
2)logstash版本2.2.2,安装目录/opt/logstash
3)测试文件为/tmp/test_file,内容只有一行
{"b":{"b1":0.0}}
4)logstash的配置文件内容

input {
file {
path => ["/tmp/test_file"]
sincedb_path => "/tmp/sincedb"
codec => json
type => "nginx_visit"
start_position => "beginning"

}
}

filter {
fingerprint {
method => "SHA1"
key => "160129"
source => ["[b]"]
}
}

output {
elasticsearch {
hosts => "192.168.233.103"
document_id => "%{fingerprint}"
}
}

问题描述:
每次停止logstash之后,删除sincedb,然后再启动logstash,在elasticsearch中会生成一个新的document,但是原来的document仍然保留。因此就产生了重复记录

另外我发现的问题还有:
1)正如我的配置文件logstash.conf中,如果logstash的input插件是file,file指定的文件test_file的内容中某一个字段含有子字段,并且子字段的数据类型是浮点数时,每次重新启动logstash,fingerprint就会产生不一样的值。
2)如果第1)条中的子字段的类型不是浮点数,而是整型或字符串型等,每次重启logstash,fingerprint就能计算出唯一值
3)我用checksum插件代替fingerprint用来生成documentID,出现的情况和fingerprint的情况相同。

请大家帮我看看我的错误出在什么地方。谢谢

@jiangzhifang 感谢反馈,这个是logstash的一个bug,issue跟踪:The result of Float type is not unique · Issue #12 · logstash-plugins/logstash-filter-fingerprint · GitHub

1 Like

谢谢您的回复。我发现用checksum插件,也遇到同样问题,logstash配置文件如下:

input {
file {
path => ["/tmp/test_file"]
sincedb_path => "/tmp/sincedb"
codec => json
type => "nginx_visit"
start_position => "beginning"
}
}

filter {
checksum {
keys => "[b]"
}
}

output {
elasticsearch {
hosts => "192.168.233.103"
document_id => "%{[logstash_checksum]}"
}
}

问题出现的条件:

1.测试文件是json格式
2.某个字段包含子字段,且子字段的值的类型是float

那么,使用fingerprint或者checksum,每次对这个字段计算,都会得出不同的值

看来也是同样的有bug