我需要的
我正在使用 Logstash 并嘗試使用 ruby?? 過濾器洗掉頂級欄位和最后一個欄位之間的欄位。頂級欄位名稱始終相同,只是其子欄位發生變化。
這些欄位看起來像這樣:
[topLevelField][fieldToRemove][fieldToKeep]
我希望它是這樣的:
[topLevelField][fieldToKeep]
另外,不是中間欄位中的所有值都會被洗掉,只是一些特定的情況,但我想我可以用一個簡單的條件來解決這個問題
我試過的
考慮到代碼都在過濾器中進行了測驗:
filter {
ruby {
code => "
# my code here
"
}
}
我嘗試使用以下被忽略的代碼洗掉:
if event.include? 'topLevelField.fieldToRemove'
event.get('topLevelField.fieldToRemove').each { |key, value|
event.set('topLevelField.#{key}', value)
}
event.remove('topLevelField.fieldToRemove')
end
baseField = event.get('topLevelField')
beRemoved = baseField.keys.select{ |key| key.to_s.match('^(fieldToRemove)$') }
beRemoved.each { |key, value|
event.set('topLevelField.#{key}', value)
}
event.get('topLevelField').keys.each { |keyToRemove|
if keyToRemove.to_s == 'fieldToRemove'
event.get(keyToRemove).each { |keyToKeep, valueToKeep|
event.set('topLevelField.#{keyToKeep}', valueToKeep)
}
end
}
我嘗試使用.each do ... end而不是“.each { ... }”,但結果是一樣的
我也嘗試過'[fieldName]'語法,但似乎也被忽略了
有沒有人有任何想法?
uj5u.com熱心網友回復:
對于第一個,在logstash 中,另一個欄位中的一個欄位稱為[foo][bar],與elasticsearch 和kibana 不同的是,它是foo.bar。對于所有這三種方法,Ruby 僅在雙引號內執行字串魔術。如果你使用
code => '
if event.include? "[topLevelField][fieldToRemove]"
event.get("[topLevelField][fieldToRemove]").each { |key, value|
event.set("[topLevelField][#{key}]", value)
}
event.remove("[topLevelField][fieldToRemove]")
end
'
那么你會得到
"topLevelField" => {
"fieldToKeep" => "Foo"
},
uj5u.com熱心網友回復:
在朋友的幫助下,我們能夠在我所做的測驗中找出問題所在。我們來到了下面的代碼:
filter {
if [topLevelField][fieldToRemove] {
ruby {
code => '
event.get("[topLevelField][fieldToRemove]").each { |key, value|
event.set("[topLevelField][#{key}]", value)
}
event.remove("[topLevelField][fieldToRemove]")
'
}
}
}
導致[topLevelField][fieldToKeep]
代碼說明
由于我不知道 ruby?? 插件對性能的影響有多大,所以我決定在呼叫插件之前檢查該欄位的存在。
if [topLevelField][fieldToRemove] { ... }
又查了幾遍,發現在ruby中使用雙引號和使用單引號是不一樣的。所以要使用雙打,我使用單引號啟動插件
ruby {
code => ' ... '
}
使用 ruby?? 訪問欄位的正確語法似乎是用括號括起來的名稱,而不是用點分隔。所以我更改了引數以遵循此語法。此外,紅寶石字串插值在用單引號括起來時不起作用。
event.get("[topLevelField][fieldToRemove]").each { |key, value|
event.set("[topLevelField][#{key}]", value)
}
event.remove("[topLevelField][fieldToRemove]")
使用單引號時,不會發生字串插值,實際上進行插值的片段被視為字串的一部分。所以上面代碼的結果將是“[topLevelField][#{key}]”而不是“[topLevelField][fieldToKeep]”
就是這樣,我希望這個解釋能幫助其他有類似問題的人。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489071.html
標籤:红宝石 日志存储 过滤 logstash-配置 麋鹿
上一篇:如何在水豚測驗中單擊跨度?
