Trions les différences et les relations entre SLF4J, Logback et Log4J ainsi que leur comportement.
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).
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. 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.
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());
}
}
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".
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.
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.
À propos, la tendance de la mise en œuvre de la journalisation n'est pas si différente (au 6 décembre 2018).
c'est tout.
Recommended Posts