2016-05-14 129 views
-4

中獲得價值,我有一個字段和值輸出看起來像紅寶石 - 在logstash

A::field_1_2_3_4_22_5_6_7_8_365 => 6 

因爲字段名是因爲「動態」包含IP和端口。 如何使用紅寶石從字段名稱中獲取值併爲其添加字段?它會看起來像

A::field => 6 
bIP => 1.2.3.4 
bport => 22 
cIP => 5.6.7.8 
cport => 365 

任何幫助將不勝感激!!謝謝

回答

1

這裏是一個非常類似的問題的答案:logstash name fields dynamically

對於這種精確的情況下,ruby過濾器需要有點更多地參與,以捕捉不同的東西

filter { 
    ruby { 
    code => " 
     newhash = {} 
     event.to_hash.each {|key, value| 
     re = /(\w::[a-z]+)_(\d+_\d+_\d+_\d+)_(\d+)_(\d+_\d+_\d+_\d+)_(\d+)/ 
     if key =~ re then 
      field, bIP, bport, cIP, cport = key.match(re).captures 
      newhash[field] = event[key] 
      newhash['bIP'] = bIP.gsub('_', '.') 
      newhash['bport'] = bport 
      newhash['cIP'] = cIP.gsub('_', '.') 
      newhash['cport'] = cport 

      event.remove(key) 
     end 
     } 
     newhash.each {|key,value| 
     event[key] = value 
     } 
    " 
    } 
} 

所以,如果你有一個領域像在事件"A::field_1_2_3_4_22_5_6_7_8_365" => "6",你的活動將隨後包含以下字段:

{ 
     "A::field" => "6", 
      "bIP" => "1.2.3.4", 
     "bport" => "22", 
      "cIP" => "5.6.7.8", 
     "cport" => "365" 
} 
+0

你能試試嗎? – Val

-1

也許我還沒有完全正確understooden這一點,但你可以使用數組和方法.push添加:

Array=[1, 2, 5, 7] 
@n = [3, 4, 6] 
Array.push(@n) => Array=[1, 2, 3, 4, 5, 6, 7] 
0

您可以使用下面的代碼:

field_name = 'A::field_1_2_3_4_22_5_6_7_8_365' 
fields = field_name.split("_") 
bID = "#{fields[1]}.#{fields[2]}.#{fields[3]}.#{fields[4]}" 
bport = "#{fields[5]}" 
bID = "#{fields[6]}.#{fields[7]}.#{fields[8]}.#{fields[9]}" 
bport = "#{fields[10]}" 
+0

由於ip和端口,字段名稱是動態的。所以我不能具體的字段名稱。它只能指定字段名稱的前綴是「A :: field_」 – andrewarnier

+0

如何獲得A :: field_字段?什麼創造了這個領域,你的代碼如何「知道」它?您能否提供一個真實的代碼示例,顯示它是如何創建(或獲取)和使用的? –

+0

HARD部分是爲了獲得該字段的名稱,並且有必要知道該字段是如何知道名稱的。在某些情況下甚至不可能獲得該名稱。 –