Introduction à la journalisation Java

Introduction à la journalisation Java

1. Vue d'ensemble

La journalisation est une aide puissante pour comprendre et déboguer le comportement d'exécution du programme. Les journaux saisissent et conservent les données importantes et les rendent disponibles pour analyse à tout moment.

Cet article décrit les frameworks de journalisation Java les plus populaires, Log4j 2 et Logback, ainsi que leur prédécesseur Log4j, et aborde brièvement SLF4J, une façade de journalisation qui fournit une interface commune à différents frameworks de journalisation.

2. Activation de la journalisation

Tous les frameworks de journalisation abordés dans l'article partagent la notion de loggers, d'appendeurs et de mises en page. L'activation de la journalisation dans le projet suit trois étapes communes:

  1. Ajout des bibliothèques nécessaires

  2. Configuration

  3. Placement des instructions de journal

Les sections suivantes traitent des étapes pour chaque cadre individuellement.

3. Log4j 2

Log4j 2 est une nouvelle version améliorée de la structure de journalisation Log4j. L'amélioration la plus convaincante est la possibilité de journalisation asynchrone. Log4j 2 nécessite les bibliothèques suivantes:


    org.apache.logging.log4j
    log4j-api
    2.6.1


    org.apache.logging.log4j
    log4j-core
    2.6.1

Dernière version delog4j-api, vous pouvez trouverhere etlog4j-core -here.

3.1. Configuration

La configuration de Log4j 2 est basée sur le fichier de configuration principallog4j.xml. La première chose à configurer est l'appender.

Ceux-ci déterminent où le message de journal sera acheminé. La destination peut être une console, un fichier, un socket, etc.

Log4j 2 a de nombreux appenders à des fins différentes, vous pouvez trouver plus d'informations sur le site officiel deLog4j 2.

Regardons un exemple de configuration simple:


    
        
            
        
    

Vous pouvez définir un nom pour chaque appender, par exemple utiliser le nomconsole au lieu destdout.

Notez l'élémentPatternLayout - cela détermine à quoi doit ressembler le message. Dans notre exemple, le modèle est défini en fonction du paramètrepattern, où%d détermine le modèle de date,%p - sortie du niveau de journalisation,%m - sortie du message journalisé et %n - ajoute un nouveau symbole de ligne. Plus d'informations sur le motif que vous pouvez trouver sur la page officielle deLog4j 2.

Enfin -to enable an appender (ou multiple) vous devez l'ajouter à la section<Root>:


    

3.2. Connexion au fichier

Parfois, vous devrez utiliser la journalisation dans un fichier, nous allons donc ajouter le loggerfout à notre configuration:


    
        
            %d{yyyy-MM-dd HH:mm:ss} %-5p %m%nw
        
    

L'appendeurFile a plusieurs paramètres qui peuvent être configurés:

  • file - détermine le nom de fichier du fichier journal

  • append - La valeur par défaut de ce paramètre est true, ce qui signifie que par défaut un appenderFile s'ajoutera à un fichier existant et ne le tronquera pas.

  • PatternLayout qui a été décrit dans l'exemple précédent.

Afin d'activer l'appenderFile, vous devez l'ajouter à la section<Root>:


    
    

3.3. Journalisation asynchrone

Si vous souhaitez rendre votre Log4j 2 asynchrone, vous devez ajouter la bibliothèque de perturbateurs LMAX à vospom.xml. LMAX disruptor est une bibliothèque de communication inter-thread sans verrouillage.

Ajouter un perturbateur à pom.xml:


    com.lmax
    disruptor
    3.3.4

La dernière version du disruptor peut être trouvéehere.

Si vous souhaitez utiliser le disrupteur LMAX, vous devez utiliser<asyncRoot> au lieu de<Root> dans votre configuration.


    
    

Vous pouvez également activer la journalisation asynchrone en définissant la propriété systèmeLog4jContextSelector surorg.apache.logging.log4j.core.async.AsyncLoggerContextSelector.

Vous pouvez bien sûr en savoir plus sur la configuration de l'enregistreur asynchrone Log4j2 et voir quelques diagrammes de performances sur lesLog4j2 official page.

3.4. Usage

Voici un exemple simple qui illustre l'utilisation de Log4j pour la journalisation:

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class Log4jExample {

    private static Logger logger = LogManager.getLogger(Log4jExample.class);

    public static void main(String[] args) {
        logger.debug("Debug log message");
        logger.info("Info log message");
        logger.error("Error log message");
    }
}

Après l'exécution, l'application enregistrera les messages suivants à la fois dans la console et dans le fichier nomméexample.log:

2016-06-16 17:02:13 INFO  Info log message
2016-06-16 17:02:13 ERROR Error log message

Si vous élevez le niveau du journal racine àERROR:

La sortie ressemblera à ceci:

2016-06-16 17:02:13 ERROR Error log message

Comme vous pouvez le constater, si vous modifiez le niveau de journalisation en paramètre supérieur, les messages dont le niveau de journalisation est inférieur ne seront pas imprimés pour les ajouts.

La méthodelogger.error peut également être utilisée pour consigner une exception qui s'est produite:

try {
    // Here some exception can be thrown
} catch (Exception e) {
    logger.error("Error log message", throwable);
}

3.5. Configuration au niveau du package

Supposons que vous deviez afficher les messages avec le niveau de journal TRACE - par exemple à partir d'un package spécifique tel quecom.example.log4j2:

logger.trace("Trace log message");

Pour tous les autres packages, vous souhaitez continuer à consigner uniquement les messages INFO.

N'oubliez pas que TRACE est inférieur au niveau de journalisation racine INFO que nous avons spécifié dans la configuration.

Pour activer la journalisation uniquement pour l'un des packages, vous devez ajouter la section suivante avant<Root> à voslog4j.xml:


    

Cela activera la journalisation pour le packagecom.example.log4j et votre sortie ressemblera à:

2016-06-16 17:02:13 TRACE Trace log message
2016-06-16 17:02:13 DEBUG Debug log message
2016-06-16 17:02:13 INFO  Info log message
2016-06-16 17:02:13 ERROR Error log message

4. Déconnexion

Logback est censé être une version améliorée de Log4j, développée par le même développeur que celui qui a créé Log4j.

Logback a également beaucoup plus de fonctionnalités que Log4j, beaucoup d'entre elles étant également introduites dans Log4j 2. Voici un aperçu de tous les avantages de Logback sur lesofficial site.

Commençons par ajouter la dépendance suivante auxpom.xml:


    ch.qos.logback
    logback-classic
    1.1.7

Cette dépendance attirera de manière transitoire deux autres dépendances, leslogback-core etslf4j-api. Notez que la dernière version de Logback peut être trouvéehere.

4.1. Configuration

Jetons maintenant un œil à un exemple de configuration de Logback:


  # Console appender
  
    
      # Pattern of log message for console appender
      %d{yyyy-MM-dd HH:mm:ss} %-5p %m%n
    
  

  # File appender
  
    example.log
    false
    
      # Pattern of log message for file appender
      %d{yyyy-MM-dd HH:mm:ss} %-5p %m%n
    
  

  # Override log level for specified package
  

  
    
    
  

Logback utilise SLF4J comme interface, vous devez donc importer lesLogger etLoggerFactory. de SLF4J

4.2. SLF4J

SLF4J fournit une interface commune et une abstraction pour la plupart des infrastructures de journalisation Java. Il agit en tant que façade et fournit une API normalisée pour accéder aux fonctionnalités sous-jacentes de la structure de journalisation.

Logback utilise SLF4J comme API native pour ses fonctionnalités. Voici un exemple d'utilisation de la journalisation Logback:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Log4jExample {

    private static Logger logger = LoggerFactory.getLogger(Log4jExample.class);

    public static void main(String[] args) {
        logger.debug("Debug log message");
        logger.info("Info log message");
        logger.error("Error log message");
    }
}

La sortie restera la même que dans les exemples précédents.

5. Log4J

Enfin, jetons un œil au vénérable cadre de journalisation Log4j.

À ce stade, il est bien sûr obsolète, mais mérite d'être discuté car il jette les bases de ses successeurs plus modernes.

La plupart des détails de la configuration correspondent à ceux décrits dans la section Log4j 2.

5.1. Configuration

Tout d'abord, vous devez ajouter la bibliothèque Log4j à vos projetspom.xml:


    log4j
    log4j
    1.2.17

Here, vous devriez pouvoir trouver la dernière version de Log4j.

Regardons un exemple complet de configuration simple de Log4j avec un seul appender de console:




    
    
        
            
        
    

    
        
        
    

<log4j:configuration debug=”false”> est une balise ouverte de la configuration entière qui a une propriété -debug. Il détermine si vous souhaitez ajouter des informations de débogage Log4j aux journaux.

5.2. Usage

Après avoir ajouté la bibliothèque et la configuration Log4j, vous pouvez utiliser le consignateur dans votre code. Jetons un coup d'oeil à un exemple simple:

import org.apache.log4j.Logger;

public class Log4jExample {
    private static Logger logger = Logger.getLogger(Log4jExample.class);

    public static void main(String[] args) {
        logger.debug("Debug log message");
        logger.info("Info log message");
        logger.error("Error log message");
    }
}

6. Conclusion

Cet article montre des exemples très simples d'utilisation de différentes infrastructures de journalisation telles que Log4j, Log4j2 et Logback. Il couvre des exemples de configuration simples pour tous les cadres mentionnés.

Les exemples qui accompagnent l'article se trouventover on GitHub.