Archiv der Kategorie: big data

Ich groke Logstash

Vorfreude

Ein riesiger Haufen Log-Dateien verschiedenster Art, Tomcat- und Access-Log, Status-Liste, Maschinen-Telegramme, wollen zusammengeführt und analysiert werden. Hierfür gibt es verschiedene Tools und Frameworks. Ich entschied mich für das populäre Gespann: Logstash-elasticsearch-Kibana.

Mein erste Gedanke war: Da kann ich endlich alles reinwerfen und dann durch die große bunte Maschine jagen. „Neues Tool, neues Glück.“

Nach dem Einsteigen in die Dokumentation trat etwas Ernüchterung ein. Ja, man kann seine Logdateien in den Logstash auf verschiedenste Weisen hineinbekommen. Will man aber die Filter benutzen, um die Daten gleich aufzubereiten und besitzt nicht wirklich Standard-Format, dann kann es schon etwas hakelig werden – Handarbeit ist gefragt.

grok mich nicht

Was einem auf dem Weg zur funktionierenden Logstash-Konfiguration zuerst begegnet ist grok (ja, ich habe meinen Heinlein gelesen). Unser vom Nginx oder Apache abweichendes Logformat soll zur Aufbereitung geparst werden. Dies geschieht vermittels einer ganzen Menge von Regex. Jede Datei-Art benötigt eigene Zuwendung.

Die Regex beinhalten 2 Aspekte:

    • sowohl einen Filter für die Logzeilen, als auch
    • Filter-Teile, welche Logzeilen-Bereich auf bestimmte Felder abgebildet werden.

Grok sucht sich also aus den einkommenden Zeilen die raus, welche zu bestimmten Regex passen und zerlegt die Zeile dann in Abschnitte. Diese Abschnitte werden im Anschluss als Werte zu den Feld-Schlüsseln in eine resultierende Map gepackt – so funktioniert dieser Filter. Das klingt aber wenig nach ‚übersichtlich‘ und ist es auch nicht.

Um sich hier die Arbeit zu erleichter, installiert man gleich die vorgefertigten Filter-Teile:
logstash-2.0.0/bin/plugin install logstash-patterns-core.

Dies kann man dann mit: logstash-2.0.0/bin/plugin list überprüfen.

Übersicht über die grok-Regex

Ich habe mir alle Filter-Dateien heruntergezogen und eine große Datei daraus gemacht:

for file in `ls logstash-patterns-core-master/patterns/*`; do echo "#--------------------------"$file >> grok_allpatterns; cat $file >> grok_allpatterns; done.

Nun kann man im Text halbwegs übersichtlich die verschachtelten Pattern ansehen.

Im Wesentlichen sind es 2 Arten von Pattern:

  • %{Ausdruck:Feldname} wobei die Ausdrücke in den Filter-Dateien definiert sind, wie %{MONTHNUM:month}
  • und dann die eigentlichen Regex der Form (?<Feldname>the pattern here)
  • diese kann man natürlich kombinieren (?<logdate>%{YEAR}-%{MONTHNUM:month}-%{MONTHDAY}.*%{TIME}) usw.

Übersichtliche Notation ist etwas anderes, aber so ist nun mal Regex. Wobei wir hier eine spezielle, ziemlich erweiterte Form von Regex vor uns haben: Onigurama. Lohnt sich auf alle Fälle mal anzusehen.

Regex bauen und testen

Man braucht schon einen Augenblick, um sich zu orientieren. Aber ohne die hervorragende spartanische Seite des Grok-Debuggers hätte ich wesentlich länger gebraucht.

Mit Try-And-Error, also in der Konfiguration Regex anpassen, Starten, Test-Log-Zeile nach Stdin kopieren und am Stdout verzweifeln, so kommt man nicht voran. Der einzige Fehlerhinweis erschöpft sich in [0] "_grokparsefailure". Da hilft mir so manche ORACLE-Fehlermeldung besser. Also lieber gleich den Debugger nehmen und Schritt für Schritt die Log-Zeile auseinander nehmen.

Wenn man besondere Meldungsteile noch einmal herausstellen möchte, also in ein eigenes Feld einfügen, dann kann man einfach mit weiteren grok-Filtern arbeiten.

filter {

# first grok
grok {
match => { „message“ => „T=\[(?<logdate>%{YEAR}-%{MONTHNUM:month}-%{MONTHDAY}.*%{TIME})\] F=\[(?<engine>[A-Za-z0-9]*)\] L=\[(?<level>[A-Z]*)\].*M=\[(?<msg>.*)“ }
}

# second grok
grok {
match => { „message“ => „NodeName; value=(?<node>.*)\|“ }
}

# no more grok just date
# use the grok field ‚logdate‘ to transport it to the result field ‚timestamp‘
date {
match => [ „logdate“ , „yyyy-MM-dd HH:mm:ss,SSS“ ]
}

Wichtig ist noch, das man den Output von Logstash auch lesen kann. Dazu stellt man den Codec ein.

stdout {

codec => rubydebug
}

Zur Belohnung erscheint folgende Anzeige:

{
„message“ => „T=[2015-10-30 12:17:28,511] F=[Log4JLogging] L=[INFO] X=[] M=[XXX benötigt:385ms| Wichtige Logmeldung; value=92441|NodeName; value=WichtigerNode.de]“,
„@version“ => „1“,
„@timestamp“ => „2015-10-30T11:17:28.511Z“,
„host“ => „procrustes“,
„logdate“ => „2015-10-30 12:17:28,511“,
„month“ => „10“,
„engine“ => „Log4JLogging“,
„level“ => „INFO“,
„msg“ => „XXX benötigt:385ms| Wichtige Logmeldung; value=92441|NodeName; value=WichtigerNode.de]“,
„node“ => „WichtigerNode.de“
}

Fazit

Für die ersten paar Stunden mit Logstash ist das gar nicht mal so schlecht gelaufen. Das dies nur der Anfang ist, wird beim Blick auf die umfängliche Plugin-Liste klar. Hier besteht viel Raum, für Experimente.

Die Logstash-Dokumentation ist sehr gut. Nicht nur lustiges Logo, sondern übersichtliche Gestaltung und fast alle Informationen vorhanden, die man braucht und wo man sie erwartet. Was will man mehr.