当前位置: 首页 > 面试题库 >

Logstash:将两个日志合并到一个输出文档中

岳风畔
2023-03-14
问题内容

我已将syslog设置为使用以下过滤器将日志发送到logstash:

output {
  elasticsearch 
  { hosts => ["localhost:9200"]
  document_id => "%{job_id}"   
}

}
filter {
    grok {
        overwrite => ["message"]
    }
    json {
     source => "message"
    }
}

我的应用程序之一的典型消息将具有初始状态和job_id:

{"job_id": "xyz782", state: "processing", job_type: "something"}

几分钟后,另一个日志将具有相同的log_id,不同的状态和处理时间:

{"job_id": "xyz782", state:"failed", processing_time: 12.345}

这些字段已正确加载,但是创建了两个文档。我希望只为初始日志创建一个文档,然后用第二个日志来更新第一个日志,这意味着更新后的文档将具有以下字段:

{"job_id": "xyz782", state: "failed", job_type: "something", processing_time: 12.345}

如您在logstash
conf输出中所看到的,我使用job_id作为文档ID,但是,第二条消息似乎替换了第一条消息中的字段,但也擦除了第一条消息中所有不在字段中的字段。例如,第二个消息中,第一个消息中出现的job_type字段未出现在最终文档中。这可能与json两次都来自同一个字段“消息”有关。还有另一种方法可以将两个日志消息合并到logstash中的一个文档中?


问题答案:

您可以使用aggregate过滤器来执行此操作。聚合筛选器支持基于公共字段值将多个日志行聚合到一个事件中。在您的情况下,公共字段将是该job_id字段。

然后,我们需要另一个字段来检测应该聚合的第一个事件与第二个事件。就您而言,这就是state字段。

因此,您只需要向现有的Logstash配置中添加另一个过滤器,如下所示:

filter {
    ...your other filters

    if [state] == "processing" {
        aggregate {
            task_id => "%{job_id}"
        }
    } else if [state] == "failed" {
        aggregate {
            task_id => "%{job_id}"
            end_of_task => true
            timeout => 120
        }
    }
}

您可以timeout根据作业的运行时间自由调整(以秒为单位)。



 类似资料:
  • 我在同一个文件夹中有两个文件:chapter1。Rmd和第2章。Rmd,包括以下内容: 第一章Rmd 第2章Rmd 如何将它们组合成一个pdf输出? 当然,渲染(input=“chapter1.Rmd”,output\u format=“pdf\u document”)可以完美地工作,但渲染(input=“chapter1.Rmd”,input=“chapter2.Rmd”,output\u fo

  • 问题内容: 运行后,结果类似于: 第一个元素是我已提取到名为的文件的内联javascript 这可行,但我想将 所有3个文件合并为一个文件 我尝试使用filesmerge.com合并JS文件,但这在引用单个文件时导致错误: 然后,我尝试使用jscompress.com进行合并,尽管这不会产生任何错误,但未呈现react root元素 我也尝试过在create-react-app repo上建议的此

  • 问题内容: 如何将这两个JToken合并为一个JToken。听起来应该很简单,但无法解决。 谢谢您的帮助! 到目前为止,这是我尝试过的: 我首先将第一个对象分配给变量,然后尝试将其连接到第二个变量。我有一个循环,可以带回具有三个字段的多个页面。最终目标是抓取每个页面并创建一个包含所有页面的大J。 像这样的东西: 问题答案: 您可以用来将一个合并到另一个。请注意,可以控制数组的合并方式。从Enume

  • 问题内容: 如何使用Java合并两个WAV文件? 我试过了,但是没有正常工作,他们还有其他方法吗? 问题答案: 如果直接使用wav文件的字节,则可以在任何编程语言中使用相同的策略。对于此示例,我将假设两个源文件具有相同的比特率/数字通道,并且具有相同的长度/大小。(否则,您可能可以在开始合并之前对其进行编辑)。 首先看一下WAV规范,我在斯坦福课程网站上找到了一个很好的人: 常见的标头长度为44或

  • 问题内容: 是否可以将两个JSON文档与Jackson JSON库合并?我基本上是将Jackson映射器与简单的Java映射一起使用。 我尝试搜索Google和Jackson的文档,但找不到任何东西。 问题答案: 一种方法是这样使用: 它将合并来自两个来源的数据。这只会进行浅表复制,即不会对包含的对象进行递归合并。 否则,您可能只需要将JSON读取为树(),在内容上循环并手动合并即可。无论如何,这