Lassen Sie uns die Unterschiede und Beziehungen zwischen SLF4J, Logback und Log4J sowie deren Verhalten untersuchen.
Die Fassade, die ein flexibles Umschalten der Java-Protokollierungsimplementierung ermöglicht, heißt SLF4J. ※SLF4J Fassade bedeutet "Vorderseite des Gebäudes" und bezieht sich auf eines der Entwurfsmuster von GoF, das "Fassadenmuster". Das Folgende ist ein Klassendiagramm des Fassadenmusters (von TECHSCORE).
Java-Protokollierungsimplementierungen umfassen Log4J, Log4J 2, Logback usw., aber SLF4J ist der Kontaktpunkt für diese Implementierungen. In der obigen Abbildung ist Facade SLF4J, Klasse A ist Log4J und Klasse B ist Logback.
Ich denke, die folgende offizielle Zahl ist leicht vorstellbar. Mit anderen Worten, aus Sicht der Anwendung fungiert SLF4J als Schnittstelle für die Protokollierungsimplementierung, und Logback und Log4J sind die Protokollierungsimplementierung selbst.
Obwohl gesagt wird, dass es die Leistung von SLF4J ist, wird es zu einem Fassadenmuster (die Leistung der Schnittstelle, wenn es darauf ankommt), aber lassen Sie uns die Vorteile der Verwendung von SLF4J mit dem folgenden Code überprüfen.
App.java
public class App {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(App.class);
logger.info("INFO LOG!! Logger Class=" + logger.getClass());
}
}
Verwenden wir zunächst Logback für die Protokollierungsimplementierung. Fügen Sie pom.xml die folgende Abhängigkeit hinzu, um Logback zu verwenden.
pom.xml
//Im Fall von Logback verursacht diese Addition allein SLF4J aufgrund der Übergangsabhängigkeit von Maven.(slf4j-api)Und logback-Kern wird auch zur Abhängigkeit hinzugefügt.
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
Versuchen Sie, App.java zu erstellen und auszuführen. Anschließend wird Folgendes an die Konsole ausgegeben.
Console.
23:53:02.124 [main] INFO co.jp.ars.App - INFO LOG!! Logger Class=class ch.qos.logback.classic.Logger
Sie können sehen, dass Logback in der Protokollierungsimplementierung verwendet wird, wie in "Logger Class = class ch.qos.logback.classic.Logger" gezeigt.
Als nächstes verwenden wir Log4J für die Protokollierungsimplementierung. Fügen Sie pom.xml die folgende Abhängigkeit hinzu, um Log4J zu verwenden.
pom.xml
//Im Fall von Log4J verursacht diese Addition allein log4j aufgrund der Übergangsabhängigkeit von Maven.-x.x.x.Das Glas wird auch zur Abhängigkeit hinzugefügt.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
Wenn Sie Log4J verwenden, ist log4j.xml (oder log4j.properties) erforderlich. Erstellen Sie daher log4j.xml im Klassenpfad wie folgt.
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="demo" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%t %-5p %c{2} - %m%n" />
</layout>
</appender>
<logger name="co.jp.ars">
<level value="info" />
<appender-ref ref="demo" />
</logger>
</log4j:configuration>
Versuchen Sie, App.java zu erstellen und auszuführen. Anschließend wird Folgendes an die Konsole ausgegeben.
Console.
main INFO ars.App - INFO LOG!! Logger Class=class org.slf4j.impl.Log4jLoggerAdapter
Es gibt "Logger Class = class org.slf4j.impl.Log4jLoggerAdapter", aber die Implementierung von Log4jLoggerAdapter ist wie folgt und es kann bestätigt werden, dass der tatsächliche Status von Logger "org.apache.log4j.Logger" ist. (Das heißt, Sie können sehen, dass Log4J für die Protokollierungsimplementierung verwendet wird.)
Log4jLoggerAdapter.java
public final class Log4jLoggerAdapter extends MarkerIgnoringBase implements LocationAwareLogger, Serializable {
private static final long serialVersionUID = 6182834493563598289L;
final transient org.apache.log4j.Logger logger;
//~ Ausgelassen ~
public void info(String msg) {
logger.log(FQCN, Level.INFO, msg, null);
}
//~ Ausgelassen ~
}
Im Fall von SLF4J + Log4J gibt es einen Zwischenadapter namens SLF4J, der zwischen ihnen bindet. Der Zwischenadapter ist der obige "Log4jLoggerAdapter". Es ist unten abgedruckt.
Ich habe gerade die Protokollierungsimplementierung in den Einstellungen geändert und keine Änderungen an der App (App.java) vorgenommen, die Protokolle ausgibt. Am Anfang erwähnte ich, dass "Facade, die ein flexibles Umschalten der Java-Protokollierungsimplementierung realisiert, SLF4J heißt", aber durch die Verwendung von Facade namens SLF4J ist es möglich, die Protokollierungsimplementierung flexibel zu wechseln.
Übrigens ist der Trend zur Implementierung der Protokollierung nicht so unterschiedlich (Stand: 6. Dezember 2018).
das ist alles.
Recommended Posts