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 capturent et conservent les données importantes et les rendent disponibles pour analyse à tout moment.

Cet article présente 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 pour 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'appenders et de layouts. L'activation de la journalisation dans le projet suit trois étapes courantes:

  1. Ajouter les bibliothèques nécessaires
  2. Configuration
  3. Placer des instructions de journal

Les sections à venir traitent des étapes de chaque cadre individuellement.

3. Log4j 2

Log4j 2 est une nouvelle version améliorée du framework de journalisation Log4j. L'amélioration la plus convaincante est la possibilité d'une 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 

Vous pouvez trouver la dernière version de log4j-api ici et log4j-core - ici.

3.1. Configuration

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

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

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

Jetons un coup d'œil à un exemple de configuration simple:

Vous pouvez définir un nom pour chaque appender, par exemple utiliser la console de nom au lieu de stdout .

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

Enfin - pour activer un appender (ou plusieurs), vous devez l'ajouter à section:

3.2. Connexion au fichier

Parfois , vous aurez besoin d'utiliser la journalisation dans un fichier, donc nous allons ajouter fsort enregistreur à notre configuration:

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

L' ajout de fichier 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 fichier appender ajoutera à un fichier existant et non tronquer.
  • PatternLayout qui a été décrit dans l'exemple précédent.

Pour activer File appender, vous devez l'ajouter à section:

3.3. Journalisation asynchrone

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

Ajout d'un disruptor à pom.xml:

 com.lmax disruptor 3.3.4 

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

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

Vous pouvez également activer la journalisation asynchrone en définissant la propriété système Log4jContextSelector sur org.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 la page officielle de Log4j2.

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é baeldung.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 de journal racine à ERROR :

La sortie ressemblera à ce qui suit:

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

Comme vous pouvez le voir, si vous modifiez le niveau de journal sur le paramètre supérieur, les messages avec des niveaux de journal inférieurs ne seront pas imprimés sur les ajouteurs.

La méthode logger.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

Disons que vous devez afficher les messages avec le niveau de journal TRACE - par exemple à partir d'un package spécifique tel que com.baeldung.log4j2 :

logger.trace("Trace log message");

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

Gardez à l'esprit que TRACE est inférieur au niveau de journal racine INFO que nous avons spécifié dans la configuration.

To enable logging only for one of packages you need to add the following section before to your log4j.xml:

It will enable logging for com.baeldung.log4j package and your output will look like:

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. Logback

Logback is meant to be an improved version of Log4j, developed by the same developer who made Log4j.

Logback also has a lot more features compared to Log4j, with many of them being introduced into Log4j 2 as well. Here's a quick look at all of the advantages of Logback on the official site.

Let's start by adding the following dependency to the pom.xml:

 ch.qos.logback logback-classic 1.1.7 

This dependency will transitively pull in another two dependencies, the logback-core and slf4j-api. Note that the latest version of Logback can be found here.

4.1. Configuration

Let's now have a look at a Logback configuration example:

 # Console appender   # Pattern of log message for console appender %d{yyyy-MM-dd HH:mm:ss} %-5p %m%n   # File appender  baeldung.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 uses SLF4J as an interface, so you need to import SLF4J's Logger and LoggerFactory.

4.2. SLF4J

SLF4J provides a common interface and abstraction for most of the Java logging frameworks. It acts as a facade and provides standardized API for accessing the underlying features of the logging framework.

Logback uses SLF4J as native API for its functionality. Following is the example using Logback logging:

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

The output will remain the same as in previous examples.

5. Log4J

Finally, let's have a look at the venerable Log4j logging framework.

At this point it's of course outdated, but worth discussing as it lays the foundation for its more modern successors.

Many of the configuration details match those discussed in Log4j 2 section.

5.1. Configuration

First of all you need to add Log4j library to your projects pom.xml:

 log4j log4j 1.2.17 

Here you should be able to find latest version of Log4j.

Lets take a look at a complete example of simple Log4j configuration with only one console appender:

is open tag of whole configuration which has one property – debug. It determines whether you want to add Log4j debug information to logs.

5.2. Usage

After you have added Log4j library and configuration you can use logger in your code. Lets take a look at a simple example:

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 de la façon dont vous pouvez utiliser différents frameworks de journalisation tels que Log4j, Log4j2 et Logback. Il couvre des exemples de configuration simples pour tous les frameworks mentionnés.

Les exemples qui accompagnent l'article se trouvent à l'adresse over sur GitHub.