Introduction à SLF4J

Introduction à SLF4J

1. Vue d'ensemble

Facade de journalisation simple pour Java (abrégé SLF4J) - agit comme unfacade pour différents cadres de journalisation (par ex. java.util.logging, logback, Log4j). Il propose une API générique rendant la journalisation indépendante de la mise en œuvre réelle.

Cela permet à différents frameworks de journalisation de coexister. Cela facilite également la migration d'un framework à un autre. Enfin, outre l’API normalisée, il propose également un «sucre syntaxique».

Cet article traite des dépendances et de la configuration nécessaires pour intégrer SLF4J à Log4j2, Logback, Log4J2 et Jakarta Commons Logging. Pour en savoir plus sur chacune de ces implémentations, vous pouvez lire l'articleIntroduction to Java Logging.

2. La configuration de Log4j2

Pour utiliser SLF4J avec Log4j2, vous devez ajouter les bibliothèques suivantes àpom.xml:


    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

La dernière version peut être trouvée ici:log4j-api,log4j-core,log4j-slf4j-impl.

La configuration de journalisation actuelle est conforme à la configuration native de Log4j 2. Voyons comment l’instanceLogger est créée:

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

Notez que lesLogger etLoggerFactory appartiennent au packageorg.slf4j. Un exemple de projet, exécuté avec la configuration expliquée, est disponiblehere.

3. La configuration de Logback

Pour utiliser SLF4J avec Logback, vous n’avez pas besoin d’ajouter SLF4J à votre chemin de classe. Logback utilise déjà SLF4J. Il est considéré comme l’implémentation de référence. Il suffit d'inclure la bibliothèque Logback:


    ch.qos.logback
    logback-classic
    1.1.7

La dernière version peut être trouvée ici:logback-classic.

La configuration est spécifique à Logback mais fonctionne de manière transparente avec SLF4J. Avec les dépendances et la configuration appropriées en place, le même code des sections précédentes peut être utilisé pour gérer la journalisation.

4.The Log4j Setup

Dans les sections précédentes, nous avons présenté un cas d'utilisation où SLF4J «s'assoit» au-dessus de la mise en œuvre de la journalisation particulière. Utilisé comme cela, il élimine complètement le cadre sous-jacent.

Dans certains cas, une solution de journalisation existante ne peut pas être remplacée, par exemple. en raison d'exigences de tiers. Cela ne signifie toutefois pas que le projet est «condamné» uniquement au cadre déjà utilisé.

SLF4J peut être configuré en tant que pont, où les appels vers une structure existante sont redirigés vers celle-ci. Ajoutons les dépendances nécessaires pour créer un pont pour Log4j:


    org.slf4j
    log4j-over-slf4j
    1.7.21

Avec la dépendance en place (vérifiez la dernière àlog4j-over-slf4j), tous les appels à Log4j seront redirigés vers SLF4J. Considérez lesofficial documentation pour en savoir plus sur le pontage des frameworks existants.

Comme avec les autres frameworks, Log4j peut servir d'implémentation sous-jacente. Ajoutons les dépendances nécessaires:


    org.slf4j
    slf4j-log4j12
    1.7.21


    log4j
    log4j
    1.2.17

La dernière version peut être trouvée ici pourslf4j-log4j12 etlog4j. Un exemple de projet, configuré de la manière expliquée est disponiblehere.

5. Configuration du pont JCL

Dans les sections précédentes, nous avons montré comment utiliser la même base de code pour prendre en charge la journalisation à l'aide de différentes implémentations. Bien que c’est la principale promesse et la principale force de SLF4J, c’est aussi l’objectif de JCL (Jakarta Commons Logging ou Apache Commons Logging).

JCL est, par ses intentions, un cadre similaire à SLF4J. La principale différence est que JCL résout l'implémentation sous-jacente au cours de l'exécution via un système de chargement de classe. Cette approche est perçue comme problématique dans les cas où des chargeurs de classes personnalisés sont en jeu.

SLF4J résout ses liaisons au moment de la compilation. Il est perçu comme plus simple mais suffisamment puissant.

Heureusement, deux frameworks peuvent fonctionner ensemble en mode bridge:


    org.slf4j
    jcl-over-slf4j
    1.7.21

La dernière version des dépendances peut être trouvée icijcl-over-slf4j.

Comme dans les autres cas, la même base de code fonctionnera parfaitement. Un exemple de projet complet exécutant cette configuration est disponiblehere.

6. AutresSLF4J Goodness

SLF4J fournit des fonctionnalités supplémentaires qui peuvent rendre la journalisation plus efficace et le code plus lisible. Par exemple, SLF4J fournit une interface très utile pour travailler avec des paramètres:

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

Voici l'exemple de code de Log4j qui fait la même chose:

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

Comme vous pouvez le voir, Log4j concaténeraStrings quel que soit le niveau dedebug activé ou non. Dans les applications à forte charge, cela peut entraîner des problèmes de performances. SLF4J concaténeraStrings uniquement lorsque le niveaudebug est activé. Pour faire la même chose avec Log4J, vous devez ajouter un blocif supplémentaire qui vérifiera si le niveaudebug est activé ou non:

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

SLF4J a normalisé les niveaux de journalisation différents pour les implémentations particulières. Le niveau de journalisation deFATAL a été abandonné (il a été introduit dans Log4j) en partant du principe que dans un cadre de journalisation, nous ne devrions pas décider quand une application doit être arrêtée.

Les niveaux de journalisation utilisés sontERROR, WARN, INFO, DEBUG, TRACE. Vous pouvez en savoir plus sur leur utilisation dans l'articleIntroduction to Java Logging.

7. Conclusion

SLF4J facilite la commutation silencieuse entre les infrastructures de journalisation. Simple, mais flexible, il permet d’améliorer la lisibilité et les performances.

Comme d'habitude, le code peut être trouvéover on GitHub. De plus, nous référençons deux autres projets dédiés à différents articles, mais contenant des configurations de journal discutées,here ethere.