[英]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"]
}
]
}
}
這是使用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
- 值類型是布爾值
- 默認值為
false
默認情況下,過濾器將以不同於標記內容的方式擴展屬性。 此選項允許您強制文本內容和屬性始終解析為哈希值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.