【问题标题】:Convert array of hash by logstash to simple hash通过logstash将散列数组转换为简单散列
【发布时间】:2020-06-29 18:17:52
【问题描述】:

我正在尝试通过 logstash 解析这个:

"attributes": [
          {
            "value": "ValueA",
            "name": "NameA"
          },
          {
            "value": "ValueB",
            "name": "NameB"
          },
          {
            "value": "ValueC",
            "name": "NameC"
          }
        ],

到这里:

"attributes": {
  "NameA": "ValueA",
  "NameB": "ValueB",
  "NameC": "ValueC"
}

有什么建议吗?

我不想将此列表拆分为更多记录...

【问题讨论】:

    标签: json ruby parsing elasticsearch logstash


    【解决方案1】:

    我找到了解决方案。对于任何处理类似问题的人,这里是解决方案和一个简短的故事......

    一开始,我试过这个:

    ruby {
      code => '
        xx = event.get("[path][to][data_source]")
        event.set(['_my_destination'], Hash[xx.collect { |p| [p[:name], p[:value]] }])
      '
    

    但由于 set 方法只允许字符串,所以返回错误。

    所以我尝试这样做:

    ruby {
      code => '
        event.get("[path][to][data_source]").each do |item|
          k = item[:name]
          event.set("[_my_destination][#{k}]", item[:value])
        end
      '
    }
    

    我花了很多时间调试它,因为它在任何地方都可以工作,除了 logstash :-D。经过一番抱怨,我终于修好了。带注释的解决方案如下。

    ruby {
      code => '
        i = 0    # need index to address hash in array 
        event.get("[json_msg][mail][headers]").each do |item|
          # need to use event.get function to get value
          k = event.get("[json_msg][mail][headers][#{i}][name]")
          v = event.get("[json_msg][mail][headers][#{i}][value]")
    
          # now it is simple
          event.set("[json_msg][headers][#{k}]", v)
          i += 1
        end
      '
    }
    

    【讨论】:

      【解决方案2】:

      我认为您应该能够使用自定义 Ruby 脚本来实现 - 请参阅 ruby 过滤器。您将使用Event API 来操纵事件。

      也许aggregate 过滤器也可以使用,但带有一个 for 循环的 Ruby 脚本对我来说似乎更简单。

      【讨论】:

        猜你喜欢
        • 2013-05-16
        • 1970-01-01
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 2016-07-18
        • 2011-08-21
        • 2012-03-27
        • 2020-12-23
        相关资源
        最近更新 更多