[JAVA] Organiser la relation entre SLF4J, Logback et Log4J ainsi que leur comportement

Trions les différences et les relations entre SLF4J, Logback et Log4J ainsi que leur comportement.

Qu'est-ce que SLF4J

La façade qui réalise une commutation flexible de l'implémentation de journalisation Java est appelée SLF4J. ※SLF4J Façade signifie «devant le bâtiment» et fait référence à l'un des modèles de conception du GoF, le «modèle de façade». Ce qui suit est un diagramme de classes du modèle de façade (de TECHSCORE). facade2.gif

Les implémentations de journalisation Java incluent Log4J, Log4J 2, Logback, etc., mais SLF4J est le point de contact pour ces implémentations. Dans la figure ci-dessus, Facade est SLF4J, classA est Log4J et classB est Logback.

Je pense que le chiffre officiel suivant est facile à imaginer. concrete-bindings.png En d'autres termes, du point de vue de l'application, SLF4J agit comme une interface pour l'implémentation de la journalisation, et Logback et Log4J sont l'implémentation de la journalisation elle-même.

Puissance de SLF4J

Bien que l'on dise que c'est la puissance de SLF4J, cela devient un modèle de façade (la puissance de l'interface en fin de compte), mais vérifions quel genre d'avantage il y a en utilisant SLF4J avec le code suivant.

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

Utilisez Logback pour la mise en œuvre de la journalisation

Tout d'abord, utilisons Logback pour la journalisation de l'implémentation. Ajoutez la dépendance suivante à pom.xml pour utiliser Logback.

pom.xml


//Dans le cas de Logback, cet ajout seul provoque SLF4J en raison de la dépendance transitoire de Maven.(slf4j-api)Et connectez-vous-core est également ajouté à la dépendance.
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>1.2.3</version>
</dependency>

Essayez de créer et d'exécuter App.java. Ensuite, ce qui suit est envoyé à la console.

Console.


23:53:02.124 [main] INFO co.jp.ars.App - INFO LOG!!  Logger Class=class ch.qos.logback.classic.Logger

Vous pouvez voir que Logback est utilisé dans l'implémentation de la journalisation, comme indiqué dans "Logger Class = class ch.qos.logback.classic.Logger".

Utilisez Log4J pour la mise en œuvre de la journalisation

Ensuite, utilisons Log4J pour l'implémentation de la journalisation. Ajoutez la dépendance suivante à pom.xml pour utiliser Log4J.

pom.xml


//Dans le cas de Log4J, cet ajout seul provoque log4j en raison de la dépendance transitionnelle de Maven.-x.x.x.Le pot est également ajouté à la dépendance.
<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>

Lorsque vous utilisez Log4J, log4j.xml (ou log4j.properties) est requis, créez donc log4j.xml sur le chemin de classe comme suit.

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>

Essayez de créer et d'exécuter App.java. Ensuite, ce qui suit est envoyé à la console.

Console.


main INFO  ars.App - INFO LOG!!  Logger Class=class org.slf4j.impl.Log4jLoggerAdapter

Il existe "Logger Class = class org.slf4j.impl.Log4jLoggerAdapter", mais l'implémentation de Log4jLoggerAdapter est la suivante, et il peut être confirmé que l'état réel de Logger est "org.apache.log4j.Logger". (Autrement dit, vous pouvez voir que Log4J est utilisé pour l'implémentation de la journalisation).

Log4jLoggerAdapter.java


public final class Log4jLoggerAdapter extends MarkerIgnoringBase implements LocationAwareLogger, Serializable {

    private static final long serialVersionUID = 6182834493563598289L;

    final transient org.apache.log4j.Logger logger;

    //~ Omis ~

    public void info(String msg) {
        logger.log(FQCN, Level.INFO, msg, null);
    }

    //~ Omis ~
}

Dans le cas de SLF4J + Log4J, il existe un adaptateur intermédiaire appelé SLF4J liant entre eux. L'adaptateur intermédiaire est le "Log4jLoggerAdapter" ci-dessus. Il est réimprimé ci-dessous. concrete-bindings.png

De quoi êtes-vous heureux?

Je viens de basculer l'implémentation de la journalisation dans les paramètres et je n'ai apporté aucune modification à l'application (App.java) qui génère les journaux. Au début, j'ai mentionné que "Facade qui réalise une commutation flexible de l'implémentation de journalisation Java s'appelle SLF4J", mais en utilisant Facade appelé SLF4J, il est possible de changer de manière flexible l'implémentation de la journalisation.

Logback, tendances Log4j

À propos, la tendance de la mise en œuvre de la journalisation n'est pas si différente (au 6 décembre 2018). キャプチャ.PNG

c'est tout.

référence

Recommended Posts

Organiser la relation entre SLF4J, Logback et Log4J ainsi que leur comportement
À propos de la relation entre les méthodes HTTP, les actions et CRUD
Méditez la querelle entre Power Mock et Jacoco avec Gradle
Vérification de la relation entre l'image Docker et le conteneur
[Java] Vérifiez la différence entre orElse et orElseGet avec IntStream
La différence entre la programmation qui utilise des classes Ruby et la programmation qui n'utilise pas
Relation entre le contrôleur et la vue
Relation entre le package et la classe
À propos de la relation entre l'opérateur d'égalité de chaîne Java (==) et l'initialisation. Débutants