簡體   English   中英

Logstash將xml拆分為數組

[英]Logstash split xml into array

是否可以使用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"]
      }
    ]
  }
}

我不希望我的值存儲為數組(我知道那里總是只有一個值)。

我知道哪些字段將從我的輸入中恢復,所以我可以自己映射結構,這不需要是動態的(盡管那會很好)。

允許將列表/數組拆分為多個事件似乎很有用,但是文檔記錄很少,我找不到如何將此過濾器用於我的用例的信息。

Logstash,從多個文檔中的xml文件中拆分事件,保留來自根標簽的信息是類似的,但不完全是我想要實現的。

Logstash:從數組到字符串的XML到JSON輸出似乎很有用,但是硬編碼數組的第一個元素必須作為單個項目(不是數組的一部分)輸出。 它讓我回想起來:

{
  "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. 或者我錯過了一些基本的東西?

這是使用logstash的內置ruby過濾器的一種方法。

過濾部分:

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過濾器完全相同。

取自文檔:

force_contentedit

默認情況下,過濾器將以不同於標記內容的方式擴展屬性。 此選項允許您強制文本內容和屬性始終解析為哈希值。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM