System.out.println contre les enregistreurs

1. Pourquoi les enregistreurs?

Lors de l'écriture d'un programme ou du développement d'une application de production d'entreprise, l'utilisation de System.out.println semble être l'option la plus simple et la plus simple. Il n'y a aucune bibliothèque supplémentaire à ajouter au chemin de classe et aucune configuration supplémentaire à effectuer.

Mais l'utilisation de System.out.println présente plusieurs inconvénients qui affectent sa convivialité dans de nombreuses situations. Dans ce didacticiel, nous expliquerons pourquoi et quand nous voudrions utiliser un enregistreur sur les anciens System.out et System.err . Nous montrerons également quelques exemples rapides utilisant le framework de journalisation Log4J2.

2. Configuration

Avant de commencer, examinons les dépendances et les configurations Maven requises.

2.1. Dépendances de Maven

Commençons par ajouter la dépendance Log4J2 à notre pom.xml :

 org.apache.logging.log4j log4j-api 2.12.1   org.apache.logging.log4j log4j-core 2.12.1 

Nous pouvons trouver les dernières versions de log4j-api et log4j-core sur Maven Central.

2.2. Configuration de Log4J2

L'utilisation de System.out ne nécessite aucune configuration supplémentaire. Cependant, pour utiliser Log4J2, nous avons besoin d'un fichier de configuration log4j.xml :

Presque tous les frameworks de journalisation nécessiteront un certain niveau de configuration, soit par programme, soit via un fichier de configuration externe, tel que le fichier XML présenté ici.

3. Séparation de la sortie du journal

3.1. System.out et System.err

Lorsque nous déployons notre application sur un serveur comme Tomcat, le serveur utilise son propre enregistreur. Si nous utilisons System.out , les journaux se retrouvent dans catalina.out . Il est beaucoup plus facile de déboguer notre application si les journaux sont placés dans un fichier séparé. Avec Log4j2, nous devons inclure un appender de fichier dans la configuration pour enregistrer les journaux d'application dans un fichier séparé.

De plus, avec System.out.println , il n'y a aucun contrôle ou filtrage des journaux à imprimer. La seule façon possible de séparer les journaux est d'utiliser System.out.println pour les journaux d'informations et System.err.println pour les journaux d'erreurs:

System.out.println("This is an informational message"); System.err.println("This is an error message");

3.2. Niveaux de journalisation Log4J2

Dans les environnements de débogage ou de développement, nous voulons voir toutes les informations que l'application imprime. Mais dans une application d'entreprise en direct, plus de journaux signifie une augmentation de la latence. Les frameworks de journalisation comme Log4J2 fournissent plusieurs contrôles de niveau de journal:

  • FATAL
  • ERREUR
  • PRÉVENIR
  • INFO
  • DÉBOGUER
  • TRACE
  • TOUT

En utilisant ces niveaux, nous pouvons facilement filtrer quand et où imprimer quelles informations :

logger.trace("Trace log message"); logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); logger.warn("Warn log message"); logger.fatal("Fatal log message");

Nous pouvons également configurer les niveaux pour chaque paquet de code source individuellement. Pour plus de détails sur la configuration du niveau de journalisation, reportez-vous à notre article Java Logging.

4. Écriture de journaux dans des fichiers

4.1. Reroutage de System.out et System.err

Il est possible de router System.out.println vers un fichier en utilisant la méthode System.setOut () :

PrintStream outStream = new PrintStream(new File("outFile.txt")); System.setOut(outStream); System.out.println("This is a baeldung article");

Et dans le cas de System.err :

PrintStream errStream = new PrintStream(new File("errFile.txt")); System.setErr(errStream); System.err.println("This is a baeldung article error");

Lors de la redirection de la sortie vers un fichier à l'aide de System.out ou System.err , nous ne pouvons pas contrôler la taille du fichier , donc le fichier continue de croître pendant la durée de l'exécution de l'application.

À mesure que la taille du fichier augmente, il peut être difficile d'ouvrir ou d'analyser ces journaux plus volumineux.

4.2. Connexion aux fichiers avec Log4J2

Log4J2 fournit un mécanisme pour écrire systématiquement des journaux dans des fichiers et également rouler les fichiers en fonction de certaines politiques. Par exemple, nous pouvons configurer les fichiers à reporter en fonction d'un modèle de date / heure :

Ou nous pouvons rouler les fichiers en fonction de leur taille une fois qu'ils atteignent un seuil donné :

...   %d{yyyy-MM-dd HH:mm:ss} %p %m%n      

5. Connexion à des systèmes externes

Comme nous l'avons vu dans la section précédente, les frameworks de journalisation permettent d'écrire les journaux dans un fichier. De même, ils fournissent également des appenders pour envoyer des journaux à d'autres systèmes et applications . Cela permet d'envoyer des journaux à un flux Kafka ou à une base de données Elasticsearch en utilisant des appenders Log4J plutôt qu'en utilisant System.out.println.

Veuillez consulter notre article sur l'appender Log4j pour plus de détails sur l'utilisation de ces appenders.

6. Personnalisation de la sortie du journal

Avec l'utilisation des enregistreurs, nous pouvons personnaliser les informations à imprimer avec le message réel. Les informations que nous pouvons imprimer incluent le nom du package, le niveau de journalisation, le numéro de ligne, l'horodatage, le nom de la méthode, etc.

While this would be possible with System.out.println, it would require a lot of manual work, while logging frameworks provide this functionality out of the box. With loggers, we can simply define a pattern in the logger configuration:

If we consider Log4J2 for our logger framework, there are several patterns that we can choose from or customize. Refer to the official Log4J2 documentation to learn more about them.

7. Conclusion

This article explains various reasons why to use a logger framework and why not to rely only on System.out.println for our application logs. While it is justifiable to use System.out.println for small test programs, we'd prefer not to use it as our main source of logging for an enterprise production application.

As always, the code examples in the article are available over on GitHub.