TOOLS THAT MATTER: GNU SCREEN

Autor: Peter Gerber, 20.04.2018 um 13:56 Uhr | Kategorien: UncategorizedSchreibe einen Kommentar

Java LOG-File Analyse auf Unix-/Linux-Systemen mit grep
Viele Java-Entwickler werden die Situation kennen. Auf einem Produktiv-, Integrations- oder Testsystem tritt ein Fehler in der von Ihnen entwickelten Java-Anwendung auf. In den meisten Fällen handelt es sich um eine Linux- oder Unix-Umgebung auf der ein Applikationsserver (GlassFish, WebSphere, …) seinen Dienst verrichtet. Nun heißt es LOG-Files analysieren, um der Ursache des Problems auf die Spur zu kommen. Aus meiner persönlichen, täglichen Erfahrung möchte ich hier einige Linux/Unix-Kommandos vorstellen und Tipps geben, die die Suche in LOG-Files erleichtern.

Suche nach Pattern und Zeichenfolgen in LOG-Files
Bei der Suche nach einem Fehler, einer ID, einer Exception, usw. über mehrere Dateien hinweg ist grep Komando und seine Wrapper und Variationen eine unschätzbare Hilfe. Gerade bei großen Dateien ist es unschlagbar, da die Datei nicht vollständig in den Speicher geladen wird (wie bei vielen Editoren), sondern Zeile für Zeile analysiert wird. So lassen ich theoretisch beliebig große Dateien durchsuchen.
Hier einige Anwendungsbeispiele:
In welchen Dateien kommt der Suchbegriff überhaupt vor.
grep -l ‘java.lang.XyzException‘ *.log
Listet alle *.log Dateien auf, in welchen die ‘java.lang.XyzException‘ geloggt wurde.
Da nur bis zum ersten Vorkommen der Exception im jeweiligen File gesucht werden muss und dann mit der nächsten Dateien fortgefahren werden kann. Ist diese Suche sehr schnell, wenn der Suchbegriff relativ früh auftaucht.
grep -L ‘java.lang.XyzException‘ *.log
Liefert alle *.log Dateien in denen die Exception NICHT geloggt wurde.
Für statistische Zwecke ist es u.U. interessant zu erfahren wie oft der Suchbegriff im jeweiligen File vorkommt.
grep -c ‘java.lang.XyzException‘ *.log
Liefert genau das.

Suche in gezipten Dateien.
Oft werden LOG-Files auf einem Server rotiert und gepackt, um Platz zu sparen und die Übersichtlichkeit zu erhöhen.
Ein Beispiel: Das LOG (server.log) des Applikationsservers kann z.B. täglich rotieren.
Aus server.log wird so jeden Tag server.log.1.gz.
Aus dem LOG von gestern wird server.log.2.gz
Aus dem LOG von gestern wird server.log.3.gz
usw.
Möchte man nun auch diese archivierten LOG-Dateien durchsuchen, ohne sie alle einzeln auspacken zu müssen, so ist zgrep das Mittel der Wahl. Es ist quasi ein Wrapper um das grep und ermöglich es direkt in gezipten Dateien zu suchen. Dabei werden fast alle Parameter unterstützt die man von grep her kennt. Außerdem erkennt zgrep ob es sich um eine gepackte Datei handelt oder nicht. Das heißt man kann auch in nicht gepackten Dateien suchen. Welchen Vorteil bringt das? Hier ein Beispiel:
z grep -l ‘java.lang.XyzException‘ server.log*
Sucht sowohl in aktuellen (ungepackten) server.log nach der Exception, als auch in allen archivierten (gepackten) LOGs (server.log.1.gz, server.log.2.gz, server.log.3.gz, …)

Advanced Regex-Pattern
Zwar unterstützt grep als Suchausdruck unterschiedlich Reguläre Ausdrücke (REGularEXpressions) mit dem Parametern –G (basic regular) und –E (extended regular expression), doch oft reichen diese Modi nicht aus.
Ich verwende darum oft die Peal-kompatible reguläre Ausdrücke, da diese sehr mächtiger sind. Mit dem Parameter –P unterstützt auch das GNU grep die RegEx-Engine. Allerdings kompilieren nicht alle Linux-Distributionen die Peal-Unterstützung mit in ihre grep-Version (z.B. Debian). Darum empfiehlt es sich pcregrep (PerlCompatibleRegularExpressionGREP) zu verwenden, welches auch noch ca. viermal schneller ist als grep -E.
Hier nun einige Anwendungsbeispiele für pcregrep
Lookaround Ausdrücke
Mit lookahead und lookbehind Ausdrücken kann die RegEx-Engine angewiesen werden einige Zeichen voraus bzw. zurück zu schauen ohne sie zu konsumieren.
Was heißt das und wozu braucht man das? Nun, da die RegEx-Engine immer einzelne Zeichen untersucht (konsumiert) und nicht mehrere Zeichen voraus (oder zurück) blickt, lassen sich Ausdrücke wie „java.lang.XyzException aber nicht gefolgt von ERRORCODE: 0815“ nicht abbilden
Aber mit einem „negative lookahead Ausdrück“ lässt sich das Problem lösen.
rcregrep -c ‘java.lang.XyzException(?! ERRORCODE:0815)‘ *.log
Dieses Aufruf zeigt uns wie oft in allen .log-Dateien im aktuellen Verzeichnis eine „java.lang.XyzException“ geloggt wurde, der aber nicht der Fehlercode „ERRORCODE:0815“ folgt.

Hier die Syntax aller lookaround

(?=…) Positive lookahead assertion
(?!…) Negative lookahead assertion
(?<=…) Positive lookbehind assertion
(?<!…) Negative lookbehind assertion

Weitere Möglichkeiten:
Es gibt noch sehr viele grep Parameter und andere Linux-Kommandos mit denen man seine grep Ausdrücke kombinieren kann.
Vielleicht habe ich den einen oder die andere neugierig gemacht, selbst weitere Möglichkeiten in der Dokumentation (Manpage) oder einem der vielen Tutorials zu ergründen

Kommentare

Es gibt noch keine Kommentare

Back to top

feedback erwünscht

Über alles was wir so bloggen, reden wir auch gerne.
Melden Sie sich bei Uns, wir freuen uns über jeden direkten Austausch.

Back to top