Bequeme Protokollierung in SpringBoot + Log4j2 + Maven

Hallo, liebe Chabrowiten.


Das in diesem Artikel vorgestellte Material ist für Anfänger gedacht und erspart mir möglicherweise mehrere Stunden Suche auf StackOverFlow und anderen Websites, um ein praktisches Protokollierungssystem zu erhalten, das selbst versteht, wo es sich an der Konsole, in der Datei oder im Logstash anmelden muss.


Zu Beginn des Projekts besteht die Aufgabe immer darin, die Protokollierung korrekt zu konfigurieren. In der lokalen Umgebung sollten die Protokolle zur Vereinfachung des Debuggens in der Konsole und in der Datei angezeigt werden. Es ist äußerst unerwünscht, die Protokolle auf dem Remote-Server an die Konsole auszugeben. Stattdessen sollten sie in die Datei geschrieben werden. logstash oder in der Datenbank. Wenn Sie Windows lokal und auf einem Remote-Linux-Computer verwenden, ist die Speicherortadresse dieser Protokolldatei unterschiedlich.


Daher gibt es viele Situationen, in denen Sie die Konfiguration des Protokollierungssystems abhängig von den äußeren Umständen ständig mit Ihren Händen korrigieren müssen.


Ich hatte es satt, mich ständig an Appender zu erinnern und diese zu kommentieren, und entwickelte eine Möglichkeit, Log4j2 so zu konfigurieren, dass abhängig vom ausgewählten Maven-Profil nur die richtigen Appender automatisch aktiviert werden.


Im Folgenden finden Sie eine Anleitung zum Einrichten eines Projekts mit Spring Boot + Maven + Log4j2. Das Ergebnis ist ein konfiguriertes Protokollierungssystem und zwei Appender: CONSOLE und SOCKET.


Zunächst werden wir Änderungen an der Maven-Konfiguration (pom.xml) vornehmen:
Fügen Sie in Variablen auf der gesamten Ebene pom.xml die Hostadresse für logstash-appender hinzu:


<properties> <logstash.host>logstashcsm.example.ru</logstash.host> </properties> 

Fügen Sie die für die Arbeit erforderlichen Abhängigkeiten hinzu:


 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> </dependencies> 

Beachten Sie, dass wir die Spring-Boot-Starter-Protokollierungsabhängigkeit von Spring-Boot-Starter-Web ausschließen.


Richten Sie Maven-Profile ein, um verbundene Appender dynamisch zu verwalten. Auf der Ebene jedes Profils legen wir die Variablen logstash.port, logger.console.tresholdFilter, logger.socket.tresholdFilter .


 <profiles> <profile> <id>local</id> <properties> <logstash.port>10000</logstash.port> <logger.console.tresholdFilter>ALL</logger.console.tresholdFilter> <logger.socket.tresholdFilter>OFF</logger.socket.tresholdFilter> </properties> </profile> <profile> <id>dev</id> <properties> <logstash.port>10001</logstash.port> <logger.console.tresholdFilter>OFF</logger.console.tresholdFilter> <logger.socket.tresholdFilter>ALL</logger.socket.tresholdFilter> </properties> </profile> </profiles> 

logstash.port - Der Port, an den Protokolle gesendet werden sollen.
logger.console.tresholdFilter - Der Wert legt die Filterstufe der auf der Konsole angezeigten Protokolle fest. In unserem Fall bedeutet ALL, dass die Protokolldatensätze aller Ebenen im Konsolen-Appender angezeigt werden.
logger.socket.tresholdFilter - Der Wert legt die Filterstufe der Protokolle fest, die an logstash gesendet werden. AUS - bedeutet, dass keine an diesen Appender gesendeten Datensätze übergeben werden.


Jetzt müssen wir Änderungen an application.properties vornehmen, damit wir aus der Datei Log4j2.xml auf den Wert der in pom.xml angegebenen Variablen zugreifen können:


logstash.host=@logstash.host@
logstash.port=@logstash.port@
logger.console.tresholdFilter=@logger.console.tresholdFilter@
logger.socket.tresholdFilter=@logger.socket.tresholdFilter@


Und schließlich konfigurieren wir die Konfiguration von Log4j2 selbst in der Datei log4j2.xml:


 <?xml version="1.0" encoding="UTF-8"?> <Configuration> <Properties> <Property name="socket.host">${bundle:application:logstash.host}</Property> <Property name="socket.port">${bundle:application:logstash.port}</Property> <Property name="console.thresholdFilter">${bundle:application:logger.console.tresholdFilter}</Property> <Property name="socket.thresholdFilter">${bundle:application:logger.socket.tresholdFilter}</Property> </Properties> <Appenders> <Console name="CONSOLE" target="SYSTEM_OUT"> <ThresholdFilter level="${console.thresholdFilter}"/> <PatternLayout pattern="%d %-5p [%t] %c{10} - %m%n"/> </Console> <Socket name="SOCKET" host="${socket.host}" port="${socket.port}" immediateFlush="true"> <ThresholdFilter level="${socket.thresholdFilter}"/> <JSONLayout eventEol="true" compact="true"/> </Socket> <Async name="ASYNC"> <AppenderRef ref="CONSOLE"/> <AppenderRef ref="SOCKET"/> </Async> </Appenders> <Loggers> <Logger name="ru.example" level="debug" additivity="false"> <AppenderRef ref="ASYNC"/> </Logger> <Root level="error"> <AppenderRef ref="ASYNC"/> </Root> </Loggers> </Configuration> 

Um den Logger in Ihrer Klasse aufzurufen, müssen Sie eine Instanz davon erstellen:


 private static Logger logger = LoggerFactory.getLogger(YourClass.class); 

und wende dich an ihn:


 logger.info("   "); 

Das ist alles. Jetzt funktioniert die Protokollierung unter Berücksichtigung des im Projekt aktiven Maven-Profils.
Beachten Sie, dass in der Liste der Datei log4j2.xml zwei Protokollierer ru.example - ru.example und root , die unterschiedliche Ebenen der Ereignisprotokollierung aufweisen. Die erste Funktion funktioniert für alle Ereignisse, die von den Klassen aus dem Beispiel ru.example.* und ru.example.* alles von der DEBUG-Ebene, und der root Logger zeichnet Ereignisse von absolut allen Klassen auf, jedoch von der ERROR-Ebene.
In diesem Fall wird die Einstellung additivity="false" verwendet, um zu verhindern, dass Einträge in den Protokollen dupliziert werden.

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


All Articles