Einführung in die Java-Protokollierung

1. Übersicht

Die Protokollierung ist eine leistungsstarke Hilfe zum Verständnis und Debuggen des Laufzeitverhaltens des Programms. Protokolle erfassen und speichern die wichtigen Daten und stellen sie zu jedem Zeitpunkt für die Analyse zur Verfügung.

Dieser Artikel beschreibt die beliebtesten Java-Protokollierungsframeworks, Log4j 2 und Logback, zusammen mit ihrem Vorgänger Log4j und geht kurz auf SLF4J ein, eine Protokollierungsfassade, die eine gemeinsame Schnittstelle für verschiedene Protokollierungsframeworks bietet.

2. Aktivieren der Protokollierung

Alle im Artikel beschriebenen Protokollierungsframeworks teilen den Begriff der Protokollierer, Appender und Layouts. Das Aktivieren der Protokollierung innerhalb des Projekts erfolgt in drei allgemeinen Schritten:

  1. Benötigte Bibliotheken hinzufügen
  2. Aufbau
  3. Platzieren von Protokollanweisungen

In den nächsten Abschnitten werden die Schritte für jedes Framework einzeln erläutert.

3. Log4j 2

Log4j 2 ist eine neue und verbesserte Version des Log4j-Protokollierungsframeworks. Die überzeugendste Verbesserung ist die Möglichkeit der asynchronen Protokollierung. Log4j 2 erfordert die folgenden Bibliotheken:

 org.apache.logging.log4j log4j-api 2.6.1   org.apache.logging.log4j log4j-core 2.6.1 

Die neueste Version von log4j-api finden Sie hier und log4j-core - hier.

3.1. Aufbau

Die Konfiguration von Log4j 2 basiert auf der Hauptkonfigurationsdatei log4j.xml . Als erstes muss der Appender konfiguriert werden.

Diese bestimmen, wohin die Protokollnachricht weitergeleitet wird. Das Ziel kann eine Konsole, eine Datei, ein Socket usw. sein.

Log4j 2 hat viele Appender für verschiedene Zwecke. Weitere Informationen finden Sie auf der offiziellen Log4j 2-Website.

Schauen wir uns ein einfaches Konfigurationsbeispiel an:

Sie können für jeden appender einen Namen festgelegt, zum Beispiel der Verwendung Namen Konsole statt stdout .

Beachten Sie das PatternLayout- Element - dies bestimmt, wie die Nachricht aussehen soll. In unserem Beispiel wird das Muster basierend auf dem eingestellten Muster param, wo % d Datum Muster bestimmt, % p - Ausgabe von Log - Level, % m - Ausgabe der protokollierten Nachricht und % n - fügt neues Liniensymbol. Weitere Informationen zum Muster finden Sie auf der offiziellen Log4j 2-Seite.

Schließlich - um einen Appender (oder mehrere) zu aktivieren , müssen Sie ihn hinzufügen Sektion:

3.2. Anmeldung in Datei

Manchmal müssen Sie die Protokollierung in einer Datei verwenden, daher fügen wir unserer Konfiguration fout logger hinzu :

   %d{yyyy-MM-dd HH:mm:ss} %-5p %m%nw   

Der Datei- Appender verfügt über mehrere Parameter, die konfiguriert werden können:

  • Datei - Bestimmt den Dateinamen der Protokolldatei
  • Anhängen - Der Standardwert für diesen Parameter ist true. Dies bedeutet, dass ein Datei- Appender standardmäßig an eine vorhandene Datei anhängt und diese nicht abschneidet.
  • PatternLayout , das im vorherigen Beispiel beschrieben wurde.

Um den Datei- Appender zu aktivieren , müssen Sie ihn hinzufügen Sektion:

3.3. Asynchrone Protokollierung

Wenn Sie Ihr Log4j 2 asynchron machen möchten, müssen Sie Ihrer pom.xml eine LMAX-Disruptorbibliothek hinzufügen . LMAX Disruptor ist eine sperrfreie Inter-Thread-Kommunikationsbibliothek.

Hinzufügen eines Disruptors zu pom.xml:

 com.lmax disruptor 3.3.4 

Die neueste Version von Disruptor finden Sie hier.

Wenn Sie LMAX Disruptor verwenden möchten, müssen Sie verwenden Anstatt von in Ihrer Konfiguration.

Sie können die asynchrone Protokollierung auch aktivieren, indem Sie die Systemeigenschaft Log4jContextSelector auf org.apache.logging.log4j.core.async.AsyncLoggerContextSelector setzen .

Sie können natürlich mehr über die Konfiguration des Log4j2-Async-Loggers lesen und einige Leistungsdiagramme auf der offiziellen Log4j2-Seite sehen.

3.4. Verwendung

Das folgende einfache Beispiel zeigt die Verwendung von Log4j für die Protokollierung:

import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; public class Log4jExample { private static Logger logger = LogManager.getLogger(Log4jExample.class); public static void main(String[] args) { logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); } }

Nach dem Ausführen protokolliert die Anwendung die folgenden Nachrichten sowohl in der Konsole als auch in der Datei mit dem Namen baeldung.log:

2016-06-16 17:02:13 INFO Info log message 2016-06-16 17:02:13 ERROR Error log message

Wenn Sie die Root-Protokollstufe auf ERROR erhöhen :

Die Ausgabe sieht folgendermaßen aus:

2016-06-16 17:02:13 ERROR Error log message

Wie Sie sehen können, werden beim Ändern der Protokollebene in den oberen Parameter die Nachrichten mit niedrigeren Protokollebenen nicht an Appender gedruckt.

Die Methode logger.error kann auch verwendet werden, um eine aufgetretene Ausnahme zu protokollieren:

try { // Here some exception can be thrown } catch (Exception e) { logger.error("Error log message", throwable); }

3.5. Konfiguration auf Paketebene

Angenommen, Sie müssen Nachrichten mit der Protokollebene TRACE anzeigen - beispielsweise aus einem bestimmten Paket wie com.baeldung.log4j2 :

logger.trace("Trace log message");

Für alle anderen Pakete möchten Sie weiterhin nur INFO-Nachrichten protokollieren.

Beachten Sie, dass TRACE niedriger ist als die INFO, die wir in der Konfiguration angegeben haben.

To enable logging only for one of packages you need to add the following section before to your log4j.xml:

It will enable logging for com.baeldung.log4j package and your output will look like:

2016-06-16 17:02:13 TRACE Trace log message 2016-06-16 17:02:13 DEBUG Debug log message 2016-06-16 17:02:13 INFO Info log message 2016-06-16 17:02:13 ERROR Error log message

4. Logback

Logback is meant to be an improved version of Log4j, developed by the same developer who made Log4j.

Logback also has a lot more features compared to Log4j, with many of them being introduced into Log4j 2 as well. Here's a quick look at all of the advantages of Logback on the official site.

Let's start by adding the following dependency to the pom.xml:

 ch.qos.logback logback-classic 1.1.7 

This dependency will transitively pull in another two dependencies, the logback-core and slf4j-api. Note that the latest version of Logback can be found here.

4.1. Configuration

Let's now have a look at a Logback configuration example:

 # Console appender   # Pattern of log message for console appender %d{yyyy-MM-dd HH:mm:ss} %-5p %m%n   # File appender  baeldung.log false  # Pattern of log message for file appender %d{yyyy-MM-dd HH:mm:ss} %-5p %m%n   # Override log level for specified package      

Logback uses SLF4J as an interface, so you need to import SLF4J's Logger and LoggerFactory.

4.2. SLF4J

SLF4J provides a common interface and abstraction for most of the Java logging frameworks. It acts as a facade and provides standardized API for accessing the underlying features of the logging framework.

Logback uses SLF4J as native API for its functionality. Following is the example using Logback logging:

import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Log4jExample { private static Logger logger = LoggerFactory.getLogger(Log4jExample.class); public static void main(String[] args) { logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); } }

The output will remain the same as in previous examples.

5. Log4J

Finally, let's have a look at the venerable Log4j logging framework.

At this point it's of course outdated, but worth discussing as it lays the foundation for its more modern successors.

Many of the configuration details match those discussed in Log4j 2 section.

5.1. Configuration

First of all you need to add Log4j library to your projects pom.xml:

 log4j log4j 1.2.17 

Here you should be able to find latest version of Log4j.

Lets take a look at a complete example of simple Log4j configuration with only one console appender:

is open tag of whole configuration which has one property – debug. It determines whether you want to add Log4j debug information to logs.

5.2. Usage

After you have added Log4j library and configuration you can use logger in your code. Lets take a look at a simple example:

import org.apache.log4j.Logger; public class Log4jExample { private static Logger logger = Logger.getLogger(Log4jExample.class); public static void main(String[] args) { logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); } }

6. Conclusion

Dieser Artikel zeigt sehr einfache Beispiele, wie Sie verschiedene Protokollierungsframeworks wie Log4j, Log4j2 und Logback verwenden können. Es enthält einfache Konfigurationsbeispiele für alle genannten Frameworks.

Die Beispiele zum Artikel finden Sie auf GitHub.