Il s'agit d'implémenter un mécanisme de logging, journalisation en français. Ce mécanisme permet à un programme de produire des informations, soit dans une console, soit dans un fichier texte lisible avec notepad ou vi.
Les informations vont porter sur le déroulement du programme : entrée dans telle fonction, lancement d'une requête SQL, connexion à un objet distant etc.
Dans un gros programme, les informations de type :
  • entrée dans la fonction XXX
  • passage de la requête YYY
deviennent très vite ingérables de par leur nombre. En plus ce niveau de détail est inutile pour l'exploitant qui lance le programme chaque jour, et qui veut juste pouvoir corriger les erreurs "grosse maille", par exemple le poste est déconnecté du réseau, erreur claire et réparable par l'exploitant.
Une fonctionnalité sympathique serait donc d'adapter le niveau des messages en fonction de l'utilisateur...
La solution utilisée dans log4j (logForJ) pour l'instant s'apparente à ça : le programme est parsemé d'instructions disant :
  • "journalise en niveau DEBUG le message AAA"
  • "journalise en niveau FATAL le message BBB"
  • "journalise en niveau DEBUG le message CCC"
  • "journalise en niveau WARNING le message DDD"
  • "journalise en niveau ERROR le message BBB"
etc etc...
Ainsi lors du lancement, on dit au programme "niveau=DEBUG" ce qui signifiera qu'il doit afficher les messages de niveau DEBUG et plus grave (soit tous les messages, DEBUG étant le niveau le mons grave). Si on lui dit "niveau=ERROR", seuls les messages de niveau ERROR et plus graves seront affichés, à savoir ERROR et FATAL.
Une fois tout cela prêt, la bibliothèque log4j permet un paramétrage sympathique par le biais d'un fichier de configuration, format XML pourquoi pas, ou texte tout simplement. Ce fichier permet de spécifier l'endroit ou vont se générer les messages, le niveau de ces messages (DEBUG, WARNING, ERROR, FATAL etc.), si l'on veut garder des sauvegardes des logs des dernières éxecutions, combien, si on limite la taille du fichier en faisant un log cyclique, tout plein d'options simples à mettre en oeuvre et bien documentées sur le web.

Allez on se lance dans le code :
Dans le constructeur de la classe on déclare un attribut de type Logger :
static Logger myLogger = Logger.getLogger(PanelFoyer.class.getName( ));
Et bien sur on récupère la config du fichier XML par le biais suivant (à insérer dans le constructeur de la classe) :
DOMConfigurator.configure(Constants.CONFIG_LOG4J);

Voila c'est fait, plus qu'à loguer :
Dans les méthodes de cette classe, lorsqu'on veut logguer quoi que ce soit, on lance l'instruction suivante :
myLogger.info("entrée dans la fonction machintruc()"); // vous avez noté qu'on logue en niveau INFO héhé :cool:
myLogger.fatal("le fichier Excel contenant les salaires a disparu"); // niveau FATAL.... :mrgreen:

Maintenant si l'on souhaite faire appel au logger dans une autre classe, pas de pb, on récupère LE logger (l'attribut static signifie qu'il n'y en a qu'un) et on logue dedans comme des grands :
// dans une autre classe :
Logger myLogger = Logger.getLogger(PanelFoyer.class.getName());
PropertyConfigurator.configure(Constants.CONFIG_LOG4J); // on n'oublie pas de récupérer la config qui va avec (on peut envisager de loguer avec une autre config si l'on souhaite....
myLogger.fatal(merr+ " Le fichier Excel de sortie est introuvable."); //et on logue

Voici un fichier de configuration xml ultrasimple pour l'exemple :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM"log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="appender" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="CESP.log"/>
<param name="Append" value="true"/>
<param name="ImmediateFlush" value="true"/>
<param name="MaxFileSize" value="1MB"/>
<param name="MaxBackupIndex" value="2" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p] %d{DATE} - %m%n"/>
</layout>
</appender>
<root>
<priority value="debug"/>
<appender-ref ref="appender"/>
</root>
</log4j:configuration>

OK now, let's code :-:)
And leave a message pleaaaase :cry: