2016-05-14 17 views
-4

ich habe ein Feld und Wert Ausgabe sieht wie folgtRubin - Gegenwert in logstash

A::field_1_2_3_4_22_5_6_7_8_365 => 6 

weil der Feldname ist „dynamische“ wegen IP und den Port enthalten. Wie verwende ich Ruby, um den Wert aus dem Feldnamen zu erhalten und ein Feld dafür hinzuzufügen? es wird aussehen wie

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

jede Hilfe !! Dank

Antwort

1

Hier ist eine Antwort auf eine sehr ähnliche Frage : logstash name fields dynamically

Aus diesem präzisen Fall der ruby Filter muss ein bisschen mehr beteiligt sein, um verschiedene Dinge

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 
     } 
    " 
    } 
} 

So zu erfassen, wenn Sie ein Feld wie "A::field_1_2_3_4_22_5_6_7_8_365" => "6" in Ihrem Fall haben, wird Ihre Veranstaltung dann die folgenden Felder enthalten:

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

Können Sie das ausprobieren? – Val

-1

Vielleicht haben nicht understooden dies ganz richtig i geschätzt wird, aber Sie können Arrays und Verfahren .push verwenden für das Hinzufügen von:

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

können Sie den folgenden Code verwenden:

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

Der Feldname ist dynamisch wegen IP und Port. also kann ich den Feldnamen nicht angeben. es ist nur kann spezifisch das Präfix des Feldnamens ist "A :: field_" – andrewarnier

+0

Wie erhalten Sie ein A :: Feld_ Feld? Was schafft dieses Feld und wie kann Ihr Code darüber "wissen"? Können Sie ein echtes Codebeispiel angeben, das zeigt, wie es erstellt (oder erworben) und verwendet wird? –

+0

Der HARTE Teil davon ist, den Namen des Feldes zu bekommen, und es ist notwendig zu wissen, wie das Feld ist, um den Namen zu erhalten. In manchen Fällen ist es nicht möglich, den Namen zu erhalten. –