Einführung in die Java-Protokollierung

Einführung in die Java-Protokollierung

1. Überblick

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.

In diesem Artikel werden die beliebtesten Java-Protokollierungsframeworks Log4j 2 und Logback sowie das Vorgängerframework Log4j beschrieben. Außerdem wird SLF4J kurz behandelt, 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 Schritten:

  1. Hinzufügen benötigter Bibliotheken

  2. Aufbau

  3. Protokollanweisungen platzieren

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 benötigt die folgenden Bibliotheken:


    org.apache.logging.log4j
    log4j-api
    2.6.1


    org.apache.logging.log4j
    log4j-core
    2.6.1

In der neuesten Version vonlog4j-api finden Siehere undlog4j-core -here.

3.1. Aufbau

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

Diese bestimmen, wohin die Protokollnachricht weitergeleitet wird. 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 offiziellenLog4j 2-Seite.

Schauen wir uns ein einfaches Konfigurationsbeispiel an:


    
        
            
        
    

Sie können für jeden Appender einen Namen festlegen, z. B. den Namenconsole anstelle vonstdout.

Beachten Sie dasPatternLayout-Element - dies bestimmt, wie die Nachricht aussehen soll. In unserem Beispiel wird das Muster basierend auf dem Parameterpattern festgelegt, wobei%d das Datumsmuster bestimmt,%p - Ausgabe der Protokollstufe,%m - Ausgabe der protokollierten Nachricht und %n - Fügt ein neues Liniensymbol hinzu. Weitere Informationen zum Muster finden Sie auf der offiziellenLog4j 2-Seite.

Schließlich -to enable an appender (oder mehrere) müssen Sie es zu<Root> Abschnitt hinzufügen:


    

3.2. Anmeldung in Datei

Manchmal müssen Sie die Protokollierung in einer Datei verwenden, daher fügen wir unserer Konfigurationfout Logger hinzu:


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

Der Appender vonFileverfügt über mehrere Parameter, die konfiguriert werden können:

  • file - bestimmt den Dateinamen der Protokolldatei

  • append - Der Standardwert für diesen Parameter ist true. Dies bedeutet, dass der Appender vonFiletandardmäßig an eine vorhandene Datei angehängt und nicht abgeschnitten wird.

  • PatternLayout, die im vorherigen Beispiel beschrieben wurden.

Um den Appender vonFilezu aktivieren, müssen Sie ihn zum Abschnitt von<Root>hinzufügen:


    
    

3.3. Asynchrone Protokollierung

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

Hinzufügen von Disruptor zu pom.xml:


    com.lmax
    disruptor
    3.3.4

Die neueste Version von Disruptor isthere.

Wenn Sie LMAX Disruptor verwenden möchten, müssen Sie in Ihrer Konfiguration<asyncRoot> anstelle von<Root> verwenden.


    
    

Sie können die asynchrone Protokollierung auch aktivieren, indem Sie die SystemeigenschaftLog4jContextSelector auforg.apache.logging.log4j.core.async.AsyncLoggerContextSelector setzen.

Sie können natürlich mehr über die Konfiguration des Async-Loggers Log4j2 lesen und einige Leistungsdiagramme fürLog4j2 official page anzeigen.

3.4. Verwendungszweck

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 Meldungen sowohl in der Konsole als auch in der Datei mit dem Namenexample.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 aufERROR erhöhen:

Die Ausgabe sieht folgendermaßen aus:

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

Wie Sie sehen können, führt das Ändern der Protokollebene in den oberen Parameter dazu, dass Nachrichten mit niedrigeren Protokollebenen nicht an Appender gedruckt werden.

Die Methodelogger.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 wiecom.example.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 in der Konfiguration angegebene Stammprotokollstufe INFO.

Um die Protokollierung nur für eines der Pakete zu aktivieren, müssen Sie den folgenden Abschnitt vor<Root> zu Ihrenlog4j.xml hinzufügen:


    

Die Protokollierung für das Paketcom.example.log4jwird aktiviert, und Ihre Ausgabe sieht folgendermaßen aus:

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. Wieder anmelden

Logback soll eine verbesserte Version von Log4j sein, die vom selben Entwickler entwickelt wurde, der auch Log4j entwickelt hat.

Logback bietet im Vergleich zu Log4j wesentlich mehr Funktionen, von denen viele auch in Log4j 2 eingeführt werden. Hier erhalten Sie einen kurzen Überblick über alle Vorteile von Logback fürofficial site.

Beginnen wir mit dem Hinzufügen der folgenden Abhängigkeit zupom.xml:


    ch.qos.logback
    logback-classic
    1.1.7

Diese Abhängigkeit zieht transitiv zwei weitere Abhängigkeiten ein, dielogback-core undslf4j-api. Beachten Sie, dass die neueste Version von Logbackhere enthält.

4.1. Aufbau

Schauen wir uns nun ein Logback-Konfigurationsbeispiel an:


  # Console appender
  
    
      # Pattern of log message for console appender
      %d{yyyy-MM-dd HH:mm:ss} %-5p %m%n
    
  

  # File appender
  
    example.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 verwendet SLF4J als Schnittstelle, daher müssen SieLogger undLoggerFactory. von SLF4J importieren

4.2. SLF4J

SLF4J bietet eine gemeinsame Schnittstelle und Abstraktion für die meisten Java-Protokollierungsframeworks. Es fungiert als Fassade und bietet eine standardisierte API für den Zugriff auf die zugrunde liegenden Funktionen des Protokollierungsframeworks.

Logback verwendet SLF4J als native API für seine Funktionalität. Das folgende Beispiel verwendet die Protokollierung der Rückmeldung:

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");
    }
}

Die Ausgabe bleibt wie in den vorherigen Beispielen.

5. Log4J

Schauen wir uns zum Schluss das ehrwürdige Log4j-Protokollierungsframework an.

Zu diesem Zeitpunkt ist es natürlich veraltet, aber es lohnt sich zu diskutieren, da es den Grundstein für seine moderneren Nachfolger legt.

Viele der Konfigurationsdetails stimmen mit den im Abschnitt Log4j 2 beschriebenen überein.

5.1. Aufbau

Zunächst müssen Sie Ihren Projektenpom.xml: die Log4j-Bibliothek hinzufügen


    log4j
    log4j
    1.2.17

Here sollten Sie in der Lage sein, die neueste Version von Log4j zu finden.

Schauen wir uns ein vollständiges Beispiel einer einfachen Log4j-Konfiguration mit nur einem Konsolen-Appender an:




    
    
        
            
        
    

    
        
        
    

<log4j:configuration debug=”false”> ist ein offenes Tag der gesamten Konfiguration mit einer Eigenschaft -debug. Hiermit wird festgelegt, ob Sie Log4j-Debuginformationen zu Protokollen hinzufügen möchten.

5.2. Verwendungszweck

Nachdem Sie die Log4j-Bibliothek und -Konfiguration hinzugefügt haben, können Sie den Logger in Ihrem Code verwenden. Schauen wir uns ein einfaches Beispiel an:

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. Fazit

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

Die Beispiele, die dem Artikel beiliegen, sindover on GitHub.