【问题标题】:How to fix duplicated documents in Elasticsearch when indexing by Logstash?通过 Logstash 建立索引时如何修复 Elasticsearch 中的重复文档?
【发布时间】:2019-05-06 22:09:16
【问题描述】:

我正在使用 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",
    ...
}

就是这样。我不知道为什么要复制。有人知道吗?

提前谢谢你...

【问题讨论】:

  • 我很惊讶地看到指纹周围的方括号。您是否尝试将 document_id 设置为“%{fingerprint}”?
  • 我秒@JoeZack,你需要用指纹作为文档ID,问题就解决了
  • 首先,感谢您的帮助。我尝试使用不带方括号的指纹,但不幸的是问题仍然存在......谢谢。

标签: elasticsearch logstash elastic-stack


【解决方案1】:

我曾经遇到过这个问题,经过多次尝试解决后,我意识到我将我的 conf 文件备份到“管道”文件夹中,而 Logstash 正在使用这个备份文件来处理输入规则。请小心,因为即使文件扩展名与“.conf”不同,Logstash 也会使用管道文件夹中的其他文件。

所以,请检查“管道”文件夹中是否还有其他文件。

如果这对您有用,请告诉我。

【讨论】:

  • 天啊!!!很好!我确实在管道目录中有另一个文件,但我不知道 Logstash 正在考虑它。我已经删除了另一个文件,问题已经解决。非常感谢。恭喜!!!
【解决方案2】:

为每个文档生成一个 UUID 密钥,然后您的问题将得到解决。

【讨论】:

  • 我们遇到了类似于 OP 和设置的问题,而 UUID 实际上解决了我们的问题。 logstash-filter-uuid 工作正常,但基本上任何类型的 ID 生成方法都可以工作,只要您在 Elasticsearch 输出中使用 document_id 参数,如下所述:elastic.co/guide/en/logstash/6.3/…
  • 首先,感谢您的帮助。我尝试使用 UUID,但不幸的是,问题仍然存在……这是我关注的链接:logstash-lessons-handling-duplicates 谢谢。
【解决方案3】:

您的代码看起来不错,不应该允许重复,也许重复的代码是在您将 document_id => "%{[fingerprint]}" 添加到您的 logstash 之前添加的,因此 elasticsearch 为其生成了一个不会被其他 id 覆盖的唯一 ID,删除重复的 ( _id 与指纹不同的那个)手动重试,它应该可以工作。

【讨论】:

  • 首先,感谢您的帮助。我正在从日志文件中进行索引,并且每个被索引的文档都是重复的,我不知道如何使用同一个文档再试一次。谢谢。
  • 然后删除整个索引,看看是否有帮助。
【解决方案4】:

我们注意到 Logstash 7.5.2 无法正常工作,它复制了来自 Filebeat 的日志。我们注意到内置 Beats 插件的实际问题有一个错误。所以我们删除了现有的并将其更新为稳定版本(6.0.14)。具体步骤如下,

download

./bin/logstash-plugin 删除logstash-input-beats

./bin/logstash-plugin install /{文件路径}/logstash-input-beats-6.0.14-java.gem

./bin/logstash-plugin list --verbose

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多