使用 Logstash 建立索引时如何修复 Elasticsearch 中的重复文档?
How to fix duplicated documents in Elasticsearch when indexing by Logstash?
我正在使用 Elastic Stack 处理我的日志文件,但在 Elasticsearch 中生成了重复的文档。
我做了一些调查,已经尝试添加 "document_id",但没有解决。
这是我的 Logstash 的配置:
input {
beats {
port => 5044
}
}
filter {
fingerprint {
source => "message"
target => "[fingerprint]"
method => "SHA1"
key => "key"
base64encode => true
}
if [doctype] == "audit-log" {
grok {
match => { "message" => "^\(%{GREEDYDATA:loguser}@%{IPV4:logip}\) \[%{DATESTAMP:logtimestamp}\] %{JAVALOGMESSAGE:logmessage}$" }
}
mutate {
remove_field => ["host"]
}
date {
match => [ "logtimestamp" , "dd/MM/yyyy HH:mm:ss" ]
target => "@timestamp"
locale => "EU"
timezone => "America/Sao_Paulo"
}
}
}
output {
elasticsearch {
hosts => "192.168.0.200:9200"
document_id => "%{[fingerprint]}"
}
}
这里是重复的文件:
{
"_index": "logstash-2019.05.02-000001",
"_type": "_doc",
"_id": "EbncP00tf9yMxXoEBU4BgAAX/gc=",
"_version": 1,
"_score": null,
"_source": {
"@version": "1",
"fingerprint": "EbncP00tf9yMxXoEBU4BgAAX/gc=",
"message": "(thiago.alves@192.168.0.200) [06/05/2019 18:50:08] Logout do usuário 'thiago.alves'. (cookie=9d6e545860c24a9b8e3004e5b2dba4a6). IP=192.168.0.200",
...
}
######### DUPLICATED #########
{
"_index": "logstash-2019.05.02-000001",
"_type": "_doc",
"_id": "V7ogj2oB8pjEaraQT_cg",
"_version": 1,
"_score": null,
"_source": {
"@version": "1",
"fingerprint": "EbncP00tf9yMxXoEBU4BgAAX/gc=",
"message": "(thiago.alves@192.168.0.200) [06/05/2019 18:50:08] Logout do usuário 'thiago.alves'. (cookie=9d6e545860c24a9b8e3004e5b2dba4a6). IP=192.168.0.200",
...
}
就是这样。我不知道为什么要复制。有人知道吗?
提前谢谢你...
为每个文档生成一个 UUID 密钥,您的问题将得到解决。
您的代码看起来不错,不应允许重复,也许重复的代码是在您将 document_id => "%{[fingerprint]}"
添加到您的 logstash 之前添加的,因此 elasticsearch 为其生成了一个不会被其他 ID 覆盖的唯一 ID,手动删除重复的(_id 不同于指纹的那个)并重试,它应该工作。
我曾经遇到过这个问题,在多次尝试解决之后,我意识到我已经将我的 conf 文件备份到 'pipeline' 文件夹中,而 Logstash 正在使用这个备份文件来处理输入规则。请小心,因为 Logstash 将使用管道文件夹中的其他文件,即使文件扩展名与“.conf”不同。
所以,请检查'pipeline'文件夹中是否还有其他文件。
如果这对你有用,请告诉我。
我们注意到 Logstash 7.5.2 无法正常工作,它复制了来自 Filebeat 的日志。我们注意到内置 Beats 插件存在错误的实际问题。所以我们删除了现有的并将其更新为稳定版本(6.0.14)。步骤如下,
./bin/logstash-plugin 删除 logstash-input-beats
./bin/logstash-plugin 安装/{文件路径}/logstash-input-beats-6.0.14-java.gem
./bin/logstash-plugin 列表 --verbose
我正在使用 Elastic Stack 处理我的日志文件,但在 Elasticsearch 中生成了重复的文档。
我做了一些调查,已经尝试添加 "document_id",但没有解决。
这是我的 Logstash 的配置:
input {
beats {
port => 5044
}
}
filter {
fingerprint {
source => "message"
target => "[fingerprint]"
method => "SHA1"
key => "key"
base64encode => true
}
if [doctype] == "audit-log" {
grok {
match => { "message" => "^\(%{GREEDYDATA:loguser}@%{IPV4:logip}\) \[%{DATESTAMP:logtimestamp}\] %{JAVALOGMESSAGE:logmessage}$" }
}
mutate {
remove_field => ["host"]
}
date {
match => [ "logtimestamp" , "dd/MM/yyyy HH:mm:ss" ]
target => "@timestamp"
locale => "EU"
timezone => "America/Sao_Paulo"
}
}
}
output {
elasticsearch {
hosts => "192.168.0.200:9200"
document_id => "%{[fingerprint]}"
}
}
这里是重复的文件:
{
"_index": "logstash-2019.05.02-000001",
"_type": "_doc",
"_id": "EbncP00tf9yMxXoEBU4BgAAX/gc=",
"_version": 1,
"_score": null,
"_source": {
"@version": "1",
"fingerprint": "EbncP00tf9yMxXoEBU4BgAAX/gc=",
"message": "(thiago.alves@192.168.0.200) [06/05/2019 18:50:08] Logout do usuário 'thiago.alves'. (cookie=9d6e545860c24a9b8e3004e5b2dba4a6). IP=192.168.0.200",
...
}
######### DUPLICATED #########
{
"_index": "logstash-2019.05.02-000001",
"_type": "_doc",
"_id": "V7ogj2oB8pjEaraQT_cg",
"_version": 1,
"_score": null,
"_source": {
"@version": "1",
"fingerprint": "EbncP00tf9yMxXoEBU4BgAAX/gc=",
"message": "(thiago.alves@192.168.0.200) [06/05/2019 18:50:08] Logout do usuário 'thiago.alves'. (cookie=9d6e545860c24a9b8e3004e5b2dba4a6). IP=192.168.0.200",
...
}
就是这样。我不知道为什么要复制。有人知道吗?
提前谢谢你...
为每个文档生成一个 UUID 密钥,您的问题将得到解决。
您的代码看起来不错,不应允许重复,也许重复的代码是在您将 document_id => "%{[fingerprint]}"
添加到您的 logstash 之前添加的,因此 elasticsearch 为其生成了一个不会被其他 ID 覆盖的唯一 ID,手动删除重复的(_id 不同于指纹的那个)并重试,它应该工作。
我曾经遇到过这个问题,在多次尝试解决之后,我意识到我已经将我的 conf 文件备份到 'pipeline' 文件夹中,而 Logstash 正在使用这个备份文件来处理输入规则。请小心,因为 Logstash 将使用管道文件夹中的其他文件,即使文件扩展名与“.conf”不同。
所以,请检查'pipeline'文件夹中是否还有其他文件。
如果这对你有用,请告诉我。
我们注意到 Logstash 7.5.2 无法正常工作,它复制了来自 Filebeat 的日志。我们注意到内置 Beats 插件存在错误的实际问题。所以我们删除了现有的并将其更新为稳定版本(6.0.14)。步骤如下,
./bin/logstash-plugin 删除 logstash-input-beats
./bin/logstash-plugin 安装/{文件路径}/logstash-input-beats-6.0.14-java.gem
./bin/logstash-plugin 列表 --verbose