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.
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
@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
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 = ":" –