2017-12-07 7 views
0

Ich habe einen Dateinamen im Format <key>:<value>-<key>:<value>.log wie z. pr:64-author:mxinden-platform:aws.log enthält Protokolle eines Testlaufs.Logstash: Dynamische Feldnamen basierend auf Dateiname

Ich möchte jede Zeile der Datei über logstash zu elasticsearch streamen. Jede Zeile sollte als separates Dokument behandelt werden. Jedes Dokument sollte die Felder entsprechend dem Dateinamen erhalten. So z.B. Für das obige Beispiel sagen wir, Log-Linie 17-12-07 foo something happened bar würde die Felder erhalten: pr mit Wert 64, author mit Wert mxinden und platform mit Wert aws.

Zu dem Zeitpunkt, an dem ich die Logstash-Konfiguration schreibe Ich kenne die Namen der Felder nicht.

Wie füge ich dynamisch Felder zu jeder Zeile hinzu, basierend auf den Feldern im Dateinamen?

Der statische Ansatz so weit ist:

filter { 
    mutate { add_field => { "file" => "%{[@metadata][s3][key]}"} } 
    else { 
    grok { match => { "file" => "pr:%{NUMBER:pr}-" } } 
    grok { match => { "file" => "author:%{USERNAME:author}-" } } 
    grok { match => { "file" => "platform:%{USERNAME:platform}-" } } 
    } 
} 

Änderungen an den Dateinamen Struktur sind in Ordnung.

+0

Ich bin nicht 100% sicher, wenn ich Ihre Frage verstehe, aber können Sie nicht einfach Ihren Dateipfad wie beschrieben [hier] (https://stackoverflow.com/questions/22916200/logstash-how-to-add) -datei-name-as-a-field? rq = 1). So etwas wie 'filter { grok { Übereinstimmung => [" Pfad ","% {GREEDYDATA}% {WORT}:% {NUMMER: pr} -% {WORT}:% {WORD: Autor} -% {WORD} :% {WORD: platform} .log "] } }' könnte für Sie arbeiten ... – Phonolog

+0

@Phonolog Aber das würde bedeuten, dass ich weiß, welche Schlüssel im Dateinamen stehen. Ich kenne die Schlüssel nicht wie z.B. 'Autor',' Plattform', 'Pr', ..., zu diesem Zeitpunkt. Ich möchte die Schlüssel dynamisch bestimmen. Mein Anwendungsfall ist, dass ich neue Felder zum Dateinamen hinzufügen kann, ohne die Logstash-Konfiguration zu berühren. – mxinden

+2

Die Art, wie ich es tun würde ist, den gesamten Dateinamen in ein Feld (ohne die .log) zu bekommen, dann verwenden Sie den kv-Filter, um auf das Feld mit dem Feld split = "-" und value split = ":" –

Antwort

0

meine eigene Frage zu beantworten, basierend auf @ dan-Griffiths comment:

Lösung für eine Datei wie pr=64,author=mxinden,platform=aws.log ist die Elasticsearch kv filter wie zB zu verwenden:

filter { 
    kv { 
     source => "file" 
     field_split => "," 
    } 
    } 

wo file ein Feld aus dem extrahierten Dateiname über das AWS S3-Eingabe-Plug-in.

Verwandte Themen