[JAVA] Organisieren Sie die Beziehung zwischen SLF4J, Logback und Log4J zusammen mit ihrem Verhalten

Lassen Sie uns die Unterschiede und Beziehungen zwischen SLF4J, Logback und Log4J sowie deren Verhalten untersuchen.

Was ist SLF4J?

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). facade2.gif

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. concrete-bindings.png Mit anderen Worten, aus Sicht der Anwendung fungiert SLF4J als Schnittstelle für die Protokollierungsimplementierung, und Logback und Log4J sind die Protokollierungsimplementierung selbst.

Leistung von SLF4J

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 Sie Logback für die Protokollierungsimplementierung

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.

Verwenden Sie Log4J für die Protokollierungsimplementierung

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. concrete-bindings.png

Worüber freust du dich?

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.

Logback, Log4j-Trends

Übrigens ist der Trend zur Implementierung der Protokollierung nicht so unterschiedlich (Stand: 6. Dezember 2018). キャプチャ.PNG

das ist alles.

Referenz

Recommended Posts

Organisieren Sie die Beziehung zwischen SLF4J, Logback und Log4J zusammen mit ihrem Verhalten
Informationen zur Beziehung zwischen HTTP-Methoden, Aktionen und CRUD
Vermitteln Sie mit Gradle den Streit zwischen Power Mock und Jacoco
Überprüfung der Beziehung zwischen dem Docker-Image und dem Container
[Java] Überprüfen Sie den Unterschied zwischen orElse und orElseGet mit IntStream
Der Unterschied zwischen der Programmierung mit Ruby-Klassen und der Programmierung ohne Ruby-Klassen
Beziehung zwischen Controller und Ansicht
Beziehung zwischen Paket und Klasse
Informationen zur Beziehung zwischen dem Java String Equality Operator (==) und der Initialisierung. Anfänger