Einführung in SLF4J

Einführung in SLF4J

1. Überblick

Simple Logging Facade für Java (abgekürzt SLF4J) - fungiert alsfacade für verschiedene Protokollierungsframeworks (z. java.util.logging, logback, Log4j). Es bietet eine generische API, die die Protokollierung unabhängig von der tatsächlichen Implementierung macht.

Dies ermöglicht die Koexistenz verschiedener Protokollierungsframeworks. Es hilft auch bei der Migration von einem Framework auf ein anderes. Schließlich bietet es neben der standardisierten API auch etwas „syntaktischen Zucker“.

In diesem Artikel werden die Abhängigkeiten und Konfigurationen erläutert, die für die Integration von SLF4J in Log4j2, Logback, Log4J2 und Jakarta Commons Logging erforderlich sind. Weitere Informationen zu jeder dieser Implementierungen finden Sie in ArtikelIntroduction to Java Logging.

2. Das Log4j2-Setup

Um SLF4J mit Log4j2 zu verwenden, sollten Siepom.xml die folgenden Bibliotheken hinzufügen:


    org.apache.logging.log4j
    log4j-api
    2.7


    org.apache.logging.log4j
    log4j-core
    2.7


    org.apache.logging.log4j
    log4j-slf4j-impl
    2.7

Die neueste Version finden Sie hier:log4j-api,log4j-core,log4j-slf4j-impl.

Die tatsächliche Protokollierungskonfiguration entspricht der nativen Log4j 2-Konfiguration. Mal sehen, wie die Instanz vonLoggererstellt wird:

public class SLF4JExample {

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

    public static void main(String[] args) {
        logger.debug("Debug log message");
        logger.info("Info log message");
        logger.error("Error log message");
    }
}

Beachten Sie, dass dieLogger undLoggerFactory zum Paketorg.slf4j gehören. Ein Beispiel für ein Projekt, das mit der erläuterten Konfiguration ausgeführt wird, isthere.

3. Das Logback-Setup

Um SLF4J mit Logback zu verwenden, müssen Sie Ihrem Klassenpfad kein SLF4J hinzufügen. Logback verwendet bereits SLF4J. Es wird als Referenzimplementierung betrachtet. Wir brauchen nur die Logback-Bibliothek einzuschließen:


    ch.qos.logback
    logback-classic
    1.1.7

Die neueste Version finden Sie hier:logback-classic.

Die Konfiguration ist logbackspezifisch, funktioniert jedoch nahtlos mit SLF4J. Mit den richtigen Abhängigkeiten und der richtigen Konfiguration kann derselbe Code aus den vorherigen Abschnitten für die Protokollierung verwendet werden.

4.The Log4j Setup

In den vorherigen Abschnitten haben wir einen Anwendungsfall behandelt, in dem SLF4J über der jeweiligen Protokollierungsimplementierung "sitzt". So verwendet, abstrahiert es das zugrunde liegende Framework vollständig.

Es gibt Fälle, in denen eine vorhandene Protokollierungslösung nicht ersetzt werden kann, z. aufgrund von Anforderungen Dritter. Dies bedeutet jedoch nicht, dass das Projekt nur zu dem bereits verwendeten Rahmen „verurteilt“ wird.

SLF4J kann als Bridge konfiguriert werden, bei der die Aufrufe an ein vorhandenes Framework an dieses umgeleitet werden. Fügen wir die erforderlichen Abhängigkeiten hinzu, um eine Brücke für Log4j zu erstellen:


    org.slf4j
    log4j-over-slf4j
    1.7.21

Wenn die Abhängigkeit vorhanden ist (auf spätestenslog4j-over-slf4j prüfen), werden alle Aufrufe von Log4j an SLF4J umgeleitet. Betrachten Sie dieofficial documentation, um mehr über die Überbrückung vorhandener Frameworks zu erfahren.

Genau wie bei den anderen Frameworks kann Log4j als zugrunde liegende Implementierung dienen. Fügen wir die erforderlichen Abhängigkeiten hinzu:


    org.slf4j
    slf4j-log4j12
    1.7.21


    log4j
    log4j
    1.2.17

Die neueste Version finden Sie hier fürslf4j-log4j12 undlog4j. Ein beispielhaftes Projekt, das auf die erläuterte Weise konfiguriert wurde, isthere verfügbar.

5. JCL Bridge Setup

In den vorherigen Abschnitten haben wir gezeigt, wie dieselbe Codebasis zur Unterstützung der Protokollierung mit verschiedenen Implementierungen verwendet werden kann. Dies ist das Hauptversprechen und die Stärke von SLF4J, aber auch das Ziel von JCL (Jakarta Commons Logging oder Apache Commons Logging).

JCL ist seiner Absicht nach ein ähnliches Framework wie SLF4J. Der Hauptunterschied besteht darin, dass JCL die zugrunde liegende Implementierung während der Ausführungszeit über ein Klassenladesystem auflöst. Dieser Ansatz wird in Fällen, in denen benutzerdefinierte Klassenladeprogramme im Spiel sind, als problematisch empfunden.

SLF4J löst seine Bindungen zur Kompilierungszeit auf. Es wird einfacher und doch mächtiger genug wahrgenommen.

Glücklicherweise können zwei Frameworks im Bridge-Modus zusammenarbeiten:


    org.slf4j
    jcl-over-slf4j
    1.7.21

Die neueste Abhängigkeitsversion finden Sie hierjcl-over-slf4j.

Wie in den anderen Fällen funktioniert die gleiche Codebasis einwandfrei. Ein Beispiel für ein vollständiges Projekt, in dem dieses Setup ausgeführt wird, isthere.

6. WeitereSLF4J Goodness

SLF4J bietet zusätzliche Funktionen, die die Protokollierung effizienter und den Code lesbarer machen. Zum Beispiel bietet SLF4J eine sehr nützliche Schnittstelle für die Arbeit mit Parametern:

String variable = "Hello John";
logger.debug("Printing variable value: {}", variable);

Hier ist das Codebeispiel von Log4j, das dasselbe tut:

String variable = "Hello John";
logger.debug("Printing variable value: " + variable);

Wie Sie sehen können, verkettet Log4jStrings, unabhängig davon, obdebugaktiviert ist oder nicht. In Anwendungen mit hoher Last kann dies zu Leistungsproblemen führen. SLF4J verkettetStrings nur, wenn der Leveldebug aktiviert ist. Um dasselbe mit Log4J zu tun, müssen Sie einen zusätzlichenif-Block hinzufügen, der prüft, ob derdebug-Level aktiviert ist oder nicht:

String variable = "Hello John";
if (logger.isDebugEnabled()) {
    logger.debug("Printing variable value: " + variable);
}

SLF4J standardisierte die Protokollierungsstufen, die für die jeweiligen Implementierungen unterschiedlich sind. Die Protokollierungsstufe vonFATALwurde gelöscht (sie wurde in Log4j eingeführt), basierend auf der Annahme, dass wir in einem Protokollierungsframework nicht entscheiden sollten, wann eine Anwendung beendet werden soll.

Die verwendeten Protokollierungsstufen sindERROR, WARN, INFO, DEBUG, TRACE. Weitere Informationen zu deren Verwendung finden Sie im ArtikelIntroduction to Java Logging.

7. Fazit

SLF4J hilft beim stillen Umschalten zwischen Protokollierungsframeworks. Es ist einfach und dennoch flexibel und ermöglicht Lesbarkeits- und Leistungsverbesserungen.

Wie üblich befindet sich der Code inover on GitHub.. Außerdem verweisen wir auf zwei andere Projekte, die verschiedenen Artikeln gewidmet sind, jedoch die besprochenen Protokollkonfigurationenhere undhere enthalten.