【问题标题】:Logstash - how do I split an array using the split filter without a target?Logstash - 如何使用没有目标的拆分过滤器拆分数组?
【发布时间】:2015-05-31 14:26:16
【问题描述】:

我正在尝试将 JSON 数组拆分为多个事件。这是一个示例输入:

{"results" : [{"id": "a1", "name": "hello"}, {"id": "a2", "name": "logstash"}]}

这是我的过滤器和输出配置:

filter {
  split {
    field => "results"
  }
}
stdout { 
  codec => "rubydebug"
}

这会产生 2 个事件,一个用于数组中的每个 JSON。它接近我正在寻找的东西:

{                                              
       "results" => {                          
          "id" => "a1",                        
        "name" => "hello"                      
    },                                         
      "@version" => "1",                       
    "@timestamp" => "2015-05-30T18:33:21.527Z",
          "host" => "laptop",                                      
}                                              
{                                              
       "results" => {                          
          "id" => "a2",                        
        "name" => "logstash"                   
    },                                         
      "@version" => "1",                       
    "@timestamp" => "2015-05-30T18:33:21.527Z",
          "host" => "laptop",                                   
}

问题在于嵌套的“结果”部分。 “结果”是目标参数的默认值。 有没有办法在不生成嵌套 JSON 的情况下使用拆分过滤器,并获得如下内容:

{                                                                     
          "id" => "a1",                        
        "name" => "hello"                      
      "@version" => "1",                       
    "@timestamp" => "2015-05-30T18:33:21.527Z",
          "host" => "laptop",                                      
}                                              
{                                              
          "id" => "a2",                        
        "name" => "logstash"                   
      "@version" => "1",                       
    "@timestamp" => "2015-05-30T18:33:21.527Z",
          "host" => "laptop",                                   
}

目的是将其提供给 ElasticSearch 输出,每个事件都是一个带有 document_id => "id" 的文档。欢迎任何好的解决方案!

【问题讨论】:

标签: elasticsearch logstash


【解决方案1】:

如果您知道所有字段将是什么(就像您所做的那样),您可以简单地重命名字段:

    mutate {
            rename => [
                    "[results][id]", "id",
                    "[results][name]", "name"
            ]
            remove_field => "results"
    }

如果您不知道所有字段是什么,您可以编写一个 ruby 代码过滤器,该过滤器执行 event['results'].each... 并从结果的子字段创建新字段。

【讨论】:

  • 使用ruby 代码的解决方案是什么?我第一次用 logstash 遇到了 ruby​​,很难猜到 event['results'].each... 会包含什么..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 2014-01-17
  • 2021-03-27
相关资源
最近更新 更多