Vous êtes sur la page 1sur 4

La Journalisation (Logging) dans Java

Extrait (remodel) dun article du magazine Programmez! de dcembre 2013


Les dveloppeurs, en gnral, et les dveloppeurs Java en particulier ont l'habitude d'utiliser des
instructions d'criture sur la sortie standard ou la sortie d'erreur pour observer le comportement d'un
programme un endroit prcis.
System.out.println(" message ") et System.err.println(" message ") sont deux instructions trs utilises en
langage Java. Ce genre d'instructions, mme en permettant de trouver des erreurs, complique le cycle de
dveloppement. Il faut penser effacer ces instructions quand le programme est fini. En cas de
changement de code les placer nouveau dans le code.
Une meilleure pratique consiste utiliser le systme de " Logging " disponible dans Java (JDK 1.4 et sup)
ou dans des programmes spars comme par exemple LOG4J. Avec des techniques de " logging " il est
possible d'afficher ou non des messages volont, la sortie est optimise et formate. Il est possible de
diriger en mme temps les messages vers plusieurs sorties, utiliser des messages spcifiques pour les
phases de dveloppement et de production.
Ce tutoriel prsente le systme et les techniques de " Logging " disponibles en standard dans JDK partir
de la version 1.4

1. Un exemple simple
Un exemple de logging le plus simple consiste obtenir un logger pour afficher un message et utiliser
toutes les proprits par dfaut. La date, l'heure et la source de l'information sont affiches par dfaut.

package atelierPE;
import java.util.logging.Level;
import java.util.logging.Logger;
public class SimpleLogger {
public static void main(String[] args) {
Logger logger = Logger.getLogger("SimpleLogger");
logger.log(Level.INFO, "Test de logger");
}
}
Affichage :
dc. 09, 2013 2:28:03 PM atelierPE.SimpleLogger main
Infos: Test de logger
getLogger() : Un logger est obtenu par un appel d'une des mthodes getLogger de la classe Logger. On
leur donne habituellement le nom de la classe o ils sont dfinis. Les noms peuvent servir organiser les
logger de faon hirarchique : il y a un logger racine de nom "", le logger "aaa" a pour parent le logger
racine, les loggers de nom "aaa.bbb" et "aaa.ccc" ont pour parent le logger de nom "aaa". Pour un nom
donn, il n'y a qu'un seul logger.
Un logger dirige des messages vers des sorties ou handlers (sortie d'erreurs standard, fichiers etc.
L'affichage de l'exemple prcdent est dirig vers la sortie d'erreurs par dfaut.
Les messages sont slectionns pour l'affichage selon un niveau fix la fois pour le logger utilis et pour
son/ses handlers. Tous les messages au-dessus du niveau fix sont affichs. L'exemple utilise le niveau
(level) " INFO " pour ses messages. Le niveau fix par la configuration par dfaut pour les loggers et la
Journalisation avec Java page 1

sortie d'erreurs est " INFO " donc les messages de ce niveau et des niveaux suprieurs " INFO " sont
affichs.

2. Niveaux (Levels)
A chaque logger est associ un level (niveau). Le level est un seuil permettant uniquement des
messages qui ont un niveau suprieur d'tre envoys vers un Handler. Tous les messages qui ont un
niveau infrieur au niveau de logger sont ignors.
Handler :
De mme chaque Handler est associ un niveau (level) et est utilis de la mme manire.
Sept Levels ou (niveau) sont dfinis et sont en ordre dcroissant :

SEVERE
WARNING
INFO
CONFIG
FINE
FINER
FINEST

Grave
Avertissement
Info
Config
Prcis
Plus prcis
Le plus prcis

Level par dfaut :


Le level par dfaut pour les loggers et les sorties d'erreurs est " INFO ". Pour FileHandler il est fix par
dfaut " ALL "
Dfinir un level (niveau) :
logger.setLevel(Level.FINE);
handler.setLevel(Level.FINE);
A partir de ces instructions tous les messages qui ont un niveau FINE et suprieur seront affichs
ATTENTION !!! : Il faut dfinir le level pour le logger et le handler

3. Handlers
Les handlers sont des sorties de loggers.
Dans JDK 5 les handlers disponibles sont :

StreamHandler : Les messages sont envoys vers OutputStream


ConsoleHandler : Les messages sont envoys vers System.err
FileHandler : Les messages sont dirigs vers un fichier
SocketHandler : Les messages sont envoys vers un port TCP
MemoryHandler : Les messages sont envoys la mmoire

Note
Par dfaut logger envoie des messages vers la sortie standard d'erreurs " System.err " via
" ConsoleHandler " et fixe son niveau (level) comme suit :
java.util.logging.ConsoleHandler.level=INFO
et comme formatter " SimpleFormat "

Journalisation avec Java page 2

Note : Par dfaut la configuration fixe le niveau (level) de logger INFO


Note : Par dfaut un logger envoie des messages son handler et aux handlers de ses parents, voir plus
loin.
ATTENTION !!! Pour crire un message " fine " par exemple il faut la fois changer le niveau (level) pour
logger et handler.

4. Envoyer des messages vers un fichier


Pour envoyer des messages vers un fichier au lieu (ou avec) de la sortie erreurs, il suffit de dfinir un
handler de fichier (FileHandler) et l'ajouter au logger.
try {
FileHandler fh=new FileHandler();
logger.addHandler(fh);
} catch (Exception e) { }
Note
:
Sans spcifier un nom pour notre fichier, le logger utilise un FileHandler par dfaut. Le fichier de log aura
comme nom " java0.log " ou un autre chiffre pour rendre ce fichier unique. Ce fichier est crit dans le
dossier local de l'utilisateur.
Important : Dans Eclipse le fichier n'est pas plac dans le projet en-cours.
Exemple :
import java.io.*;
import java.util.logging.*;
public class SimpleLogger {
public static void main(String[] args) {
Logger logger = Logger.getLogger("flogger");
try {
FileHandler fh=new FileHandler();
logger.addHandler(fh);
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

5. Spcifier un nom pour le fichier de log


En construisant un objet FileHandler, il est possible de donner un nom au fichier (avec le chemin). Dans
Eclipse un fichier sans chemin est un fichier avec un chemin implicite dans le projet en-cours.

Journalisation avec Java page 3

Exemple :
import java.io.IOException;
import java.util.logging.*;
public class SimpleLogger {
public static void main(String[] args) {
Logger logger = Logger.getLogger("flogger");
try {
FileHandler fh=new FileHandler("myLog.txt");
logger.addHandler(fh);
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

6. Choix du format
Contenu du fichier log suivant le format
FileHandler fh = new FileHandler();
fh.setFormatter(new XMLFormatter()))

FileHandler fh = new FileHandler();


fh.setFormatter(new SimpleFormatter())

<?xml version="1.0" encoding="windows1252" standalone="no"?>


<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
<date>2010-05-14T11:25:18<date>
<millis>1273829118484</millis>
<sequence>0</sequence>
<logger>aaa</logger>
<level>SEVERE<level>
<class>Test$1</class>
<method>actionPerformed</method>
<thread>10
<message>le message </message>
</record>
</log>

14 mai 2010 11:30:49 Test$1


actionPerformed
GRAVE: le message

7. Approfondissements
Le systme de logging a encore beaucoup de fonctionnalits non abordes dans ce tutoriel,
SocketHandler, utiliser des arguments dans des messages, utiliser Jconsole, instrumentation, pour ne citer
que quelques exemples.

Journalisation avec Java page 4

Vous aimerez peut-être aussi