【问题标题】:Logstash(6.5.4) elasticsearch outputLogstash(6.5.4) 弹性搜索输出
【发布时间】:2022-12-04 23:51:55
【问题描述】:

我的 filebeat 在两台服务器上。假设 app1 和 app2

我的日志格式

jobID status data

例子: 应用程序 1 日志

5hgsxyt3838 SCHEDULED data

应用程序2日志

5hgsxyt3838 COMPLETE data

这两个日志都具有相同的 jobID。 我将此 jobID 用作 elasticsearch 上的文档 _id

elasticsearch {
            hosts => [ "localhost:9200" ]
            index => "import-export-logger-%{index-name}"
            document_id => "%{jobID}"
        }

现在我希望我在 elasticsearch 中的最终状态为 COMPLETE,但有时 app1 上的负载很高,因此首先处理 app2 日志,然后再处理 app1。 所以最终状态变为SCHEDULED

有没有办法防止这种情况发生,即我希望仅在状态不完整时更新我的​​文档? 当状态为 COMPLETE 时,文档不能自行更新

【问题讨论】:

  • 你可以做的是,在 COMPLETE 上你说它是一个更新插入,如果文档存在你更新它,如果不存在你创建它。在 SCHEDULE 上创建,如果文档不存在,它将创建一个文档,但如果不存在,它将失败存在。

标签: elasticsearch logstash


【解决方案1】:

我不太喜欢覆盖这样的事件(最好只记录所有事件,然后在您的查询中进行过滤)。

但是如果你想走那条路,你可以这样做:

output {
    if [status] == "COMPLETE" {
        elasticsearch {
            hosts => [ "localhost:9200" ]
            index => "import-export-logger-%{index-name}"
            document_id => "%{jobID}"
            action => "update"
            doc_as_upsert => true
        }
    }
    else {
        elasticsearch {
            hosts => [ "localhost:9200" ]
            index => "import-export-logger-%{index-name}"
            document_id => "%{jobID}"
            action => "create"
        }
    }
}

因此,如果状态为 scheduled 将创建文档(如果不存在),complete 将更新或创建。

【讨论】:

  • 嗨,@llermaly ...感谢您的回复。假设我在 app1 中的日志是5hgsxyt3838 SCHEDULED data,而在 app2 上的日志是按顺序打印的5hgsxyt3838 RUNNING data5hgsxyt3838 RUNNING data5hgsxyt3838 COMPLETE data。在 logstash 中使用 document_id 字段的目的是跟踪作业的实时状态。如果我使用你建议的方法,我将在我的 elasticsearch 中有一个重复的 jobID 条目。你能告诉我一种方法来检查 elasticsearch 中是否存在以 _id 作为 jobID 的文档并且其状态为 COMPLETE 那么我应该能够拒绝该 jobID 的任何其他事件
  • 答案会这样做。您不能创建 2 个具有相同 id 的文档,因此如果它是完整的,您将创建(如果不存在),如果存在则更新并拒绝任何具有相同 id 的文档 adterwards
  • 您可以反转 if 逻辑并说如果完成更新,否则创建
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2014-03-26
相关资源
最近更新 更多