Arrays Logstash将xml拆分为数组

Arrays Logstash将xml拆分为数组,arrays,xml,logstash,logstash-configuration,Arrays,Xml,Logstash,Logstash Configuration,是否可以使用logstash将xml转换为对象数组 这就是我的示例文档: { "Title" : "My blog title", "Body" : "My first post ever", "Metadata" : "<root><Tags><TagTypeID>1</TagTypeID><TagValue>twitter</TagValue></Tags><Tags><TagT

是否可以使用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>"
}
然而,我无法做到这一点。我尝试过这样使用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"]
      }
    ]
  }
}
我不希望我的值被存储为数组(我知道那里总是只有一个值)

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

看起来很有用,但是文档记录得很差,我找不到如何在我的用例中使用这个过滤器的信息

类似,但不完全是我想要实现的

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

{
  "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"]
      }
    ]
  }
}
  • 不必创建自定义过滤器就可以做到这一点吗?(我没有 Ruby方面的经验)
  • 还是我缺少一些基本的东西

  • 这里有一种使用logstash内置的方法

    过滤器部分:

    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"
          }
      ]
    }
    
    输出:

    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行代码应该不会造成太大的伤害。

    最新的Logstash版本(目前为5.1.1)已经更新了XML过滤器,它具有
    force_array
    选项。默认情况下,它处于启用状态。将此设置为
    false
    将执行与接受答案中的ruby filter完全相同的操作

    摘自文件:

    强制内容编辑
    • 值类型为
    • 默认值为
      false
    默认情况下,过滤器将以不同于标记内内容的方式展开属性。此选项允许您强制文本内容和属性始终解析为哈希值


    这就是我一直在寻找的,也正是它。我不介意几行Ruby。非常感谢。