【问题标题】:Logstash split xml into arrayLogstash 将 xml 拆分为数组
【发布时间】:2016-12-14 01:23:31
【问题描述】:

是否可以使用 logstash 将 xml 转换为对象数组?

那将是我的示例文档:

{
  "Title" : "My blog title",
  "Body" : "My first post ever",
  "Metadata" : "<root><Tags><TagTypeID>1</TagTypeID><TagValue>twitter</TagValue></Tags><Tags><TagTypeID>1</TagTypeID><TagValue>facebook</TagValue></Tags><Tags><TagTypeID>2</TagTypeID><TagValue>usa</TagValue></Tags><Tags><TagTypeID>3</TagTypeID><TagValue>smartphones</TagValue></Tags></root>"
}

理想情况下,我想输出这个:

{
  "Title" : "My blog title",
  "Body" : "My first post ever",
  "Metadata" : [
    {
      "TagTypeID" : "1",
      "TagValue" : "twitter"
    },
    {
      "TagTypeID" : "1",
      "TagValue" : "facebook"
    },
    {
      "TagTypeID" : "2",
      "TagValue" : "usa"
    },
    {
      "TagTypeID" : "3",
      "TagValue" : "smartphones"
    }
  ]
}

但是我无法做到这一点。我尝试使用这样的 xml 过滤器:

xml
{
    source => "Metadata"
    target => "Parsed"
}

但是,它会输出这个

{
  "Title" : "My blog title",
  "Body" : "My first post ever",
  "@version" : "1",
  "@timestamp" : "2015-10-27T17:21:31.961Z",
  "Parsed" : {
    "Tags" : [
      {
        "TagTypeID" : ["1"],
        "TagValue" : ["twitter"]
      },
      {
        "TagTypeID" : ["1"],
        "TagValue" : ["facebook"]
      },
      {
        "TagTypeID" : ["2"],
        "TagValue" : ["usa"]
      },
      {
        "TagTypeID" : ["3"],
        "TagValue" : ["smartphones"]
      }
    ]
  }
}

我不希望将我的值存储为数组(我知道那里总是只有一个值)。

我知道要从我的输入中带回哪些字段,因此我可以自己映射结构,这不需要是动态的(尽管这样会很好)。

Allow splitting of lists / arrays into multiple events 似乎很有用,但它的文档记录很差,我找不到如何在我的用例中使用此过滤器的信息。

Logstash, split event from an xml file in multiples documents keeping information from root tags 类似,但不完全是我想要实现的目标。

Logstash: XML to JSON output from array to string 这似乎很有用,但是它硬编码数组的第一个元素必须作为单个项目(不是数组的一部分)输出。它让我想起了这个:

{
  "Title" : "My blog title",
  "Body" : "My first post ever",
  "@version" : "1",
  "@timestamp" : "2015-10-27T17:21:31.961Z",
  "Parsed" : {
    "Tags" : [
      {
        "TagTypeID" : "1",
        "TagValue" : "twitter"
      },
      {
        "TagTypeID" : ["1"],
        "TagValue" : ["facebook"]
      },
      {
        "TagTypeID" : ["2"],
        "TagValue" : ["usa"]
      },
      {
        "TagTypeID" : ["3"],
        "TagValue" : ["smartphones"]
      }
    ]
  }
}
  1. 可以在不创建自定义过滤器的情况下完成此操作吗? (我没有 Ruby 方面的经验)
  2. 或者我在这里缺少一些基本的东西?

【问题讨论】:

    标签: arrays xml logstash logstash-configuration


    【解决方案1】:

    这是使用 logstash 的内置 ruby filter 的一种方法。

    过滤部分:

    filter {
        xml {
            source => "Metadata"
            target => "Parsed"
        }
    
        ruby {  code => "
            event['Parsed']['Tags'].each do |x|
                x.each do |key, value|
                    x[key] = value[0]
                end
            end"
        }
    }
    

    输出:

    "Parsed":{
      "Tags":[
          {
          "TagTypeID":"1",
          "TagValue":"twitter"
          },
          {
          "TagTypeID":"1",
          "TagValue":"facebook"
          },
          {
          "TagTypeID":"2",
          "TagValue":"usa"
          },
          {
          "TagTypeID":"3",
          "TagValue":"smartphones"
          }
      ]
    }
    

    如果我理解正确,这就是您想要的结果。您需要在 ruby​​ 过滤器中指定 xml 字段:event['Parsed']['Tags']。是否需要更加动态?如果您还需要什么,请告诉我。

    无需创建自定义过滤器就可以做到这一点吗? (我没有 Ruby 的经验)

    嗯,是的,也不是。是的,因为这不是真正的自定义过滤器,而是内置解决方案。不,因为我倾向于说没有 Ruby 就无法做到这一点。我必须承认 Ruby 似乎是一个没有吸引力的解决方案。不过,这是一种灵活的方法,5 行代码应该不会造成太大影响。

    【讨论】:

    • 这实际上是我一直在寻找的东西,正是它。我不介意几个 Ruby 行。谢谢!
    【解决方案2】:

    最新的 Logstash 版本(此时为 5.1.1)更新了 XML 过滤器,其中包含 force_array 选项。默认情况下启用。将此设置为 false 将与接受答案中的 ruby​​ 过滤器完全相同。

    取自文档:

    force_contentedit

    • 值类型为boolean
    • 默认值为false

    默认情况下,过滤器将扩展属性与标签内的内容不同。此选项允许您强制文本内容和属性始终解析为哈希值。

    https://www.elastic.co/guide/en/logstash/current/plugins-filters-xml.html#plugins-filters-xml-force_array

    【讨论】:

      猜你喜欢
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多