【问题标题】:Parsing JSON objects with arbitrary keys in Logstash在 Logstash 中使用任意键解析 JSON 对象
【发布时间】:2018-01-15 22:33:47
【问题描述】:

考虑来自http://demo.nginx.com/status 的样本输出的一个子集:

{
  "timestamp": 1516053885198,
  "server_zones": {
    "hg.nginx.org": {
      ...  // Data for "hg.nginx.org"
    },
    "trac.nginx.org": {
      ...  // Data for "trac.nginx.org"
    }
  }
}

"hg.nginx.org""track.nginx.org" 的键是相当随意的,我想将它们解析成对 Elasticsearch 有意义的东西。换句话说,"server_zones" 下的每个键都应该转换为一个单独的事件。因此,Logstash 应该发出以下事件:

[
    {
        "timestamp": 1516053885198,
        "server_zone": "hg.nginx.org",
        ...  // Data for "hg.nginx.org"
    },
    {
        "timestamp": 1516053885198,
        "server_zone": "trac.nginx.org",
        ...  // Data for "trac.nginx.org"
    }
]

最好的方法是什么?

【问题讨论】:

    标签: json logstash


    【解决方案1】:

    您可以尝试使用 ruby​​ 过滤器。获取服务器区域并使用您要包含的键值对创建一个新对象。从我的头顶看,像下面这样的东西应该可以工作。显然,您需要将该对象映射到索引中的字段。根据您的自定义格式更改片段,即根据需要构建数组或对象。

    filter {    
      ruby {
           code => "  time = event.get('timestamp')
                      myArr = []
                      event.to_hash.select {|k,v| ['server_zones'].include?(k)}.each do |key,value| 
                         myCustomObject = {}                        
                         #map the key value pairs into myCustomObject 
                         myCustomObject[timestamp] = time 
                         myCustomObject[key] = value
                         myArr.push(myCustomObject) #you'd probably move this out based on nesting level
                      end 
                      map['my_indexed_field'] = myArr
                     "
        }
    }
    

    在输出部分使用 ruby​​debug 进行错误调试

    output {
      stdout { codec => rubydebug }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 2021-02-19
      • 2011-01-27
      • 2021-07-03
      • 1970-01-01
      相关资源
      最近更新 更多