Le Logger Java

Lors de la conception d’un logiciel en Java, nous avons toujours besoin de savoir comment se déroule l’exécution du programme. La tenue d’un fichier de log permet d’obtenir des détails sur cette exécution. Les opérations de log peuvent être très différentes du fait de leur support (console, fichier, réseau). Elles peuvent également générer des erreurs lors de l’accès à la même ressource par plusieurs Thread. En Java, la classe Logger permet de réaliser des logs précis et elle est très facilement manipulable. C’est pour cela que j’ai choisi aujourd’hui de vous la présenter.

Java et la Classe Logger

En théorie

La classe Logger fait partie du package java.util.logging, API Java pour la gestion des logs. Elle permet l’enregistrement de LogRecord sur plusieurs supports d’information. Ces LogRecord contiennent des informations qui vont être utilisées par les classes Handler pour écrire le log.

 

Les Handlers

Les Handler sont les objets qui vont déterminer quelles actions effectuer lors de l’appel d’une méthode de log. En fonction des besoins, on va utiliser l’une ou l’autre des classes Handler suivantes :

  • MemoryHandler : Données conservées en mémoire pour être utilisées plus tard.
  • FileHandler : Données inscrites dans un fichier
  • ConsoleHandler : Données affichées en console
  • SocketHandler : Données envoyées sur un flux réseau

La classe Handler peut recevoir un Formatter qui va définir la forme du message de sortie. L’API logging de Java possède par défaut deux Formatters. Le SimpleFormatter rend un message avec la date et la classe qui a appelé le Logger sur deux lignes distinctes. Le XMLFormatter va présenter les mêmes informations mais sous un format XML.

 

La Factory

La classe Logger possède une méthode de fabrique des instances permettant de récupérer une instance de Logger, getLogger(String name).  Les instances sont nommées. Ces noms sont des chaînes de caractères mais il est conseillé d’utiliser le namespace de la classe courante. Ce conseil n’est pas anodins. En effet, les Loggers possèdent une hiérarchie qui se base sur les namespace utilisés lors de leur création. Et l’appel d’un Logger va conduire à l’appel successif de tous les parents de celui-ci selon certaines règles que nous verrons plus bas.

Ici, la variable log1 est le parent de la variable log2 lui-même parent de log3. Un appel d’une méthode de log sur log3 va réaliser la méthode de ce Logger puis va appeler la même méthode de log2 et ainsi de suite.

Cette instance n’est pas statique ni conservée dans un pool, elle peut être détruite si une référence n’est pas conservée. Il est possible d’utiliser un Logger anonyme qui n’est alors rattaché à aucun namespace particulier, getAnonymousLogger().

 

Les Levels

    Les instances de Logger possèdent un attribut de type Level. Celui-ci va déterminer à partir de quel niveau le Logger doit inscrire le message qu’il reçoit. Ce Level représente le niveau minimum que cet objet doit prendre en compte. Les messages envoyés avec un niveau inférieur ne seront pas gérés. La classe Level est un type enum qui contient plusieurs valeurs communes représentant des niveaux d’informations :

  • Off : désactive le Logger en lui attribuant la valeur la plus haute possible.
  • Severe (1000) : pour les erreurs qui vont empêcher l’exécution du programme.
  • Warning (900) : pour les erreurs importantes sur l’application.
  • Info (800) : pour fournir des informations sur le déroulement du programme.
  • Config (700) : concerne les données précises d’une configuration, à utiliser pour la résolution de problèmes.
  • Fine (500) : pour la résolution de problèmes mineurs sans beaucoup d’informations systèmes.
  • Finer (400) : pour les messages d’exceptions levées dans l’application.
  • Finest (300) : un niveau très détaillé de message.
  • All : active le Logger pour tous les niveaux existants en lui attribuant la valeur la plus petite.

Les Levels des parents sont transmis de manière descendante à la hiérarchie des Loggers jusqu’à se qu’un fils se voit attribuer explicitement un Level

 

Les méthodes

    La classe Logger propose plusieurs méthodes de log. Les méthodes log permettent un log simple à partir d’un Level, d’un message et quelques autres paramètres permettant de préciser le message. Les méthodes logp sont semblables aux méthodes log mais permettent de préciser la classe et la méthode qui a appelé le Logger. En plus du logp, les méthodes logrb utilisent un RessourceBundle qui est une chaîne de caractères représentant l’endroit où sont écrits les logs. Des méthodes permettent de générer des logs en fonction d’actions réalisées sur des méthodes (génération de logs en entrée, entering, en sortie, exiting, ou lors de la levée d’une exception, throwing). Enfin, la classe Logger contient des méthodes simples et rapides de log qui ne prennent en paramètre que le message et qui portent le nom du Level associé (severe, warning, info…).

 

En pratique

Conclusion

La classe Logger est un outil indispensable lorsqu’une application prend de l’ampleur. Elle permet de vérifier le déroulement du traitement dans l’application et fournit des indications importantes en cas d’erreur. Toutes les méthodes qu’elle propose permettent de mettre en place très simplement un suivi dans l’application et la gestion des Level permet la séparation de ce qui est sensible pour l’application, comme les incidents majeurs, et ce qui ne représente que de l’information factuelle.

spacer

Laisser un commentaire