Java: Reduzieren Sie mehrzeilige Protokolle mithilfe von Spring and Logback oder Log4j2 in ein einzeiliges Protokoll

Logback und Log4j2 sind einige der bekanntesten JAVA-Protokollierungsframeworks. Das Logback-Framework wird nur in Verbindung mit der SLF4J-Bibliothek verwendet, die eine Schnittstelle für Ereignisprotokollierungssysteme darstellt. Log4j2 ist die zweite, verbesserte Version des Log4-Loggers, einer Protokollierungsbibliothek, in der API und Implementierung getrennt sind, sodass Sie die Log4j 2-API in Verbindung mit der Implementierung eines anderen Loggers verwenden können.

Spring Music ist eine Anwendung zur Verwendung des Cloud Foundry-Umgebungsdatenbankdienstes in Verbindung mit Spring Framework und Spring Boot. Es wurde erstellt, um dieselben Domänenobjekte in einem von vielen verschiedenen Repositorys zu speichern - objektrelational, dokumentenorientiert oder verteilt (Schlüsselwertspeicher).



Die beiden häufigsten Logger, die mit Spring / Spring Boot verwendet werden, sind Logback und Log4j2. Bis vor kurzem hatte der Entwickler mehr Handlungsspielraum hinsichtlich des Formats der Protokolle und der für die Protokollierung verwendeten Dateien. In der modernen Welt der Containerimplementierung und -skalierung bietet die Protokollierung jedoch in der Regel Unternehmenslösungen, die einen bestimmten Standardisierungsgrad erfordern.

Eines der größten Probleme besteht darin, dass Java-Ausnahmen in der Regel zu einer umfangreichen mehrzeiligen Stapelverfolgung in den Protokollen führen. Aus diesem Grund verfügen Sie anstelle eines einzelnen Protokollereignisses, das auf eine Ausnahme oder eine Fehlermeldung hinweist, über mehr als 100 verschiedene Protokolle, eines für jede Zeile der Stapelablaufverfolgung, die mit anderen Protokollereignissen von anderen Diensten oder Dienstinstanzen durchsetzt sind.

Dieser Artikel beschreibt, wie Sie die Spring Boot-Anwendung so konfigurieren, dass Ausnahmen in einer einzigen Zeile für den Logback-Logger und für Log4j2 reduziert werden. Dies ermöglicht es uns, die Ausnahmenprotokollierung und die Stapelverfolgung als ein Ereignisprotokoll zu betrachten.


Fehler- und Ausnahmeklassen in JAVA


JAVA Checked und Unchecked Unchecked Exception Exceptions

Frühlingsmusik App


In diesem Artikel wird für die benutzerdefinierte Protokollierung eine benutzerdefinierte Version der Spring-Music- Anwendung verwendet, die für den Betrieb von Logback- und Log4j2-Loggern erforderlich ist. Zuerst müssen Sie sicherstellen, dass wir es aus der Quelle neu erstellen können. Das Projekt erfordert Java8. Der erste Schritt ist die Installation von Java8 auf Ihrem Ubuntu-Host.



Dann nehmen wir den Quellcode des Projekts mit github und erstellen die Assembly mit den eingebauten Skripten des Gradle-Build-Systems:



Reduzieren Sie mehrzeilige Ausnahmen mit Logback


Fahren wir fort und erstellen ein JAR-Archiv des JAR-Projekts mit der Implementierung des Logback-Loggers unter Verwendung des Gradle-Standardbefehls:



Die Datei „build / libs / spring-music.jar“ führt sich selbst aus und enthält einen integrierten Tomcat, der an localhost gebunden ist: 8080. Die JAR-Datei wird mit dem folgenden Befehl aufgerufen:



Wenn Sie im Browser http: // localhost: 8080 aufrufen, wird eine Seite mit einer Liste von Alben angezeigt, und in der Konsole wird die folgende Protokollzeile angezeigt:



Diese Protokollzeilensyntax wird in „ src / main / resources / logback-spring.xml “ mithilfe einer benutzerdefinierten Vorlage definiert:



Die Variablen $ {...} werden aus application.properties und Systemeigenschaften extrahiert, die auf der Seite unter http: // localhost: 8080 / env angezeigt werden. Der Teil des Codes, den wir benötigen, befindet sich jedoch unmittelbar nach der Nachricht (% m).



Das Wort 'MULTIEXCEPTION' hat keine besondere Bedeutung. Es ist lediglich eine eindeutige Zeichenfolgenmarkierung, mit der wir herausfinden können, wo die Nachricht endet (% m) und die Ausnahme beginnt. Wenn Sie möchten, können Sie diesen Marker verlassen.

Anstatt einfach einen% xException-Platzhalter einzufügen, der eine große Stapelablaufverfolgung mit Zeilenumbrüchen auslöst, konvertieren wir den Wert mit der% replace-Funktion und ersetzen alle Zeilenumbrüche durch den Ausdruck „\ u2028“, der eine Unicode-Zeichenketten-Trennzeichenansicht ist .

Wenn Sie die Zeichen "\ n" aus dem Stack-Trace entfernen, wird der Stack-Trace nun einzeilig gesendet. Um dies zu beweisen, rufen Sie http: // localhost: 8080 / errors / throw auf . Dort befindet sich ein Fehler-Controller , der absichtlich eine NullPointerException mit dem folgenden Code auslöst:



Dadurch wird eine Protokollzeile in der Konsole erstellt (siehe unten):



Hier ist zu erkennen, dass der Ausdruck „u2028“ einen ehemaligen Zeilenvorschub im Stack-Trace trennt. Jetzt werden die Ausnahmemeldung und der Stack-Trace als Einheit gesendet.



Reduzieren Sie mehrzeilige Ausnahmen mit Log4j2


Um das Standarderstellungsskript zu überschreiben und Log4j2 als Sicherungsimplementierung dieses Projekts zu verwenden, müssen Sie die Datei "build-log4j2.gradle" verwenden.



Die Datei „build / libs / spring-music.jar“ führt sich selbst aus und verwendet den integrierten Tomcat, der an localhost: 8080 gebunden ist. Wie im vorherigen Beispiel wird die JAR-Datei mit dem folgenden Befehl aufgerufen:



Wenn Sie http: // localhost: 8080 über einen Browser aufrufen, wird eine Seite mit einer Liste von Alben mit einer Protokollzeilenausgabe an die Konsole angezeigt, die folgendermaßen aussieht:



Diese Protokollzeilensyntax wird in „ src / main / resources / log4j2.xml “ mithilfe einer benutzerdefinierten Vorlage definiert:



Die Variablen $ {...} werden aus application.properties und Systemeigenschaften extrahiert, die auf der Seite unter http: // localhost: 8080 / env angezeigt werden. Der Teil des Codes, den wir benötigen, befindet sich jedoch unmittelbar nach der Nachricht (% m).



Das Wort 'MULTIEXCEPTION' hat keine besondere Bedeutung. Es ist nur eine eindeutige Linienmarkierung unserer Wahl, mit der Sie herausfinden können, wo die Nachricht endet (% m) und die Ausnahme beginnt. Wenn Sie möchten, können Sie es verlassen.

Aber anstatt nur einen% xException-Platzhalter einzufügen, der einen großen Stack-Trace mit Zeilenumbrüchen auslöst, konvertieren wir den Wert mit der% replace-Funktion, die alle Zeilenumbrüche durch den Ausdruck "\ u2028" ersetzt, der ein Begrenzer ist Unicode-Zeichenfolgen .

Wenn Sie die Zeichen "\ n" aus dem Stack-Trace entfernen, wird der Stack-Trace jetzt als einzelne Zeile gesendet. Um dies zu beweisen, rufen Sie http: // localhost: 8080 / errors / throw auf . Dort befindet sich ein Fehler-Controller , der absichtlich eine NullPointerException mit dem folgenden Code auslöst:



Dadurch wird eine Protokollzeile in der Konsole erstellt (siehe unten):



Wie Sie sehen können, trennt hier der Ausdruck "u2028" einen ehemaligen Zeilenvorschub im Stack-Trace. Jetzt werden die Ausnahmemeldung und der Stack-Trace als Einheit gesendet.

Schlussfolgerungen


Die Möglichkeit, die mehrzeilige Ablaufverfolgung des Java-Stacks in eine Zeile zusammenzufassen, bedeutet, dass diese Technik als einzelne zentralisierte Protokollierungslösung betrachtet werden kann.
Es gibt keinen Grund, Rechenaufwand und Personal für die Wiederherstellung der Stapelverfolgung auf der Zielseite mithilfe von Korrelationskennungen, großen Stapelgrößen, hoher Prozessorauslastung und intelligentem Parsing zu verschwenden, wenn diese Faltung auf der Quellseite wesentlich effizienter ist.

In diesem Fall kann das Unicode-Zeichen immer auf der Seite des Sammelns von Protokollen ersetzt werden (z. B. auf der Seite der Pipeline zum Sammeln, Filtern und Normalisieren von Logstash-Protokollen), um die Nachricht in ihrem ursprünglichen Format wiederherzustellen.

Referenzmaterial



Ein bisschen Werbung :)


Vielen Dank für Ihren Aufenthalt bei uns. Mögen Sie unsere Artikel? Möchten Sie weitere interessante Materialien sehen? Unterstützen Sie uns, indem Sie eine Bestellung aufgeben oder Ihren Freunden Cloud-basiertes VPS für Entwickler ab 4,99 US-Dollar empfehlen, ein einzigartiges Analogon zu Einstiegsservern, das wir für Sie erfunden haben: Die ganze Wahrheit über VPS (KVM) E5-2697 v3 (6 Kerne) 10 GB DDR4 480 GB SSD 1 Gbit / s ab 19 Dollar oder wie teilt man den Server? (Optionen sind mit RAID1 und RAID10, bis zu 24 Kernen und bis zu 40 GB DDR4 verfügbar).

Dell R730xd 2-mal billiger im Equinix Tier IV-Rechenzentrum in Amsterdam? Nur wir haben 2 x Intel TetraDeca-Core Xeon 2 x E5-2697v3 2,6 GHz 14C 64 GB DDR4 4 x 960 GB SSD 1 Gbit / s 100 TV ab 199 US-Dollar in den Niederlanden! Dell R420 - 2x E5-2430 2,2 GHz 6C 128 GB DDR3 2x960 GB SSD 1 Gbit / s 100 TB - ab 99 US-Dollar! Lesen Sie mehr über das Erstellen von Infrastruktur-Bldg. Klasse C mit Dell R730xd E5-2650 v4 Servern für 9.000 Euro für einen Cent?

Source: https://habr.com/ru/post/de482804/


All Articles