2015-10-28 7 views
6

Ich analysiere eine Reihe von Daten in einen ELK-Stack für einige Nicht-Tech-Leute zu sehen. Als Teil davon möchte ich alle Felder außer einer bestimmten bekannten Teilmenge von Feldern aus den Ereignissen entfernen, bevor ich sie in ElasticSearch sende. ein neues Feld wird hinzugefügt, um die Eingangsdaten (die Daten gezogen, da oft zu jeder Zeit in diesem Fall Logstash Filter remove_field für alle Felder außer einer angegebenen Liste von Feldern

filter { 
    mutate { 
     remove_field => [ "throw_away_field1", "throw_away_field2" ] 
    } 
} 

passieren kann, ist:

kann ich angeben, jedes Feld explizit wie so in einem mutiert Filter fallen aus einer Warteschlange und von mehreren Systemen für mehrere Zwecke verwendet) würde eine Aktualisierung der Filterung erforderlich sein, was zusätzlichen Aufwand bedeutet, der nicht benötigt wird. Ganz zu schweigen von der Tatsache, dass einige sensible Daten zwischen der Aktualisierung der Eingangsströme und der Aktualisierung der Filterung bestanden haben.

Gibt es eine Möglichkeit, mit dem Logstash-Filter über jedes Feld eines Objekts zu iterieren, und remove_field, wenn es nicht in einer Liste von Feldnamen ist? Oder müsste ich einen benutzerdefinierten Filter schreiben, um dies zu tun? Grundsätzlich möchte ich für jedes einzelne Objekt nur 8 spezifische Felder behalten und absolut alles andere werfen.

Es scheint sehr minimal if ![field] =~ /^value$/ Typ Logik ist in der Datei logstash.conf verfügbar, aber ich sehe keine Beispiele, die über die Felder selbst in einem for each Stil iterieren und den Feldnamen mit einer Liste von Werten vergleichen .

Antwort:

Nach logstash auf 1.5.0 aktualisieren zu können, Plugin-Erweiterungen verwendet werden, wie Pflaume, endete die Lösung wie diese aufzublicken:

filter { 
    prune { 
     interpolate => true 
     whitelist_names => ["fieldtokeep1","fieldtokeep2"] 
    } 
} 

Antwort

5

Prune weiße Liste sollte sein, was du schaust nach.

Für eine genauere Steuerung ist das Ablegen auf den Ruby-Filter wahrscheinlich der nächste Schritt.

+0

, die wie genau sieht, was ich suche. Ich werde es versuchen und Bericht erstatten ... – redstonemercury

+0

Ich musste Logstash aktualisieren, um diese Funktion zu bekommen, daher die Verzögerung, aber das tut genau das, was ich suche. Danke für die schnelle Antwort! Akzeptiert :) – redstonemercury

3

Eine andere Möglichkeit wäre geparsten json in neue ein Feld zu bewegen und als Verwendung mutieren, z:

filter { 
    json { 
     source => "json" 
     target => "parsed_json" 
    } 

    mutate { 
     add_field => {"nested_field" => "%{[parsed_json][nested_field]}"} 
     remove_field => [ "json", "parsed_json" ] 
    } 
} 
+0

Dies ist eine großartige alternative Lösung, und hätte verhindert, dass ich logstash upgraden muss, um den Prune-Filter zu installieren. – redstonemercury

+0

@redstonemercury Ich denke, Sie können Plug-in installieren, anstatt ein Upgrade für logstash 'logstash-filter-prune' vorzunehmen – oivoodoo

Verwandte Themen