précédent | suivant | table des matières

Les logs

Sommaire
  1. Introduction
  2. Logger
  3. Handler
    1. FileHandler
    2. SocketHandler
    3. MemoryHandler
    4. ConsoleHandler
  4. Formatter

(Démonstration)

1 Introduction

L'API java.util.logging contient les classes pour gérer simplement des fichiers journaux (fichiers logs) dans lesquels les applications laissent une trace de leur exécution. Les lignes de ces journaux sont habituellement constituées de la date, l'heure, la classe et la méthode où s'est produit l'événement noté dans le journal, et un message. Plusieurs sources : les loggers peuvent écrire dans différents supports : les handlers des messages de différents niveaux.

public static void main(String [] args){
   AppliLogging al = new AppliLogging();

   al.monLog = Logger.getLogger(
           AppliLogging.class.getName());
   al.monLog.log(Level.INFO, 
            démarrage de l'application");
  
   al.setVisible(true);
}
Permet d'afficher à la console le texte suivant :

    12 mai 2010 16:45:56 AppliLogging main
    INFO: démarrage de l'application
Un logger envoie ses messages vers un handler :
  • La sortie d'erreur standard (System.err) (par défaut).
  • Vers un fichier.
  • Vers une connexion TCP.
A chaque logger est affecté un niveau, et seuls les messages de niveau supérieur ou égal à ce niveau sont transmis au handler. A chaque Handler est affecté un niveau, et seuls les messages de niveau supérieur ou égal à ce niveau sont acceptés. Les niveaux par défaut sont :
  • INFO pour la console
  • ALL pour les handlers fichier et socket
Les niveaux sont par ordre décroissant :
  • OFF
  • SEVERE
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST
  • ALL

Exemple :


// création d'un Logger et d'un Handler
Logger monLog = Logger.getLogger(AppliLogging.class.getName());
monLog.setLevel(Level.ALL); //pour envoyer les messages de tous les niveaux
monLog.setUseParentHandlers(false); // pour supprimer la console par défaut
ConsoleHandler ch = new ConsoleHandler();
ch.setLevel(Level.INFO); // pour n'accepter que les message de niveau &Ge; INFO
monLog.addHandler(ch);

// envoi de messages ...
monLog.log(Level.WARNING," le message ");
monLog.log(Level.SEVERE," le message ", new Exception());// les messages + la pile d'exécution

2 ILa classe Logger

Un logger est obtenu par un appel d'une des méthodes getLogger de la classe Logger. On leur donne habituellement le nom de la classe où ils sont définis. Les noms servent à organiser les logger de façon hiérarchique : 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 peut être associé à un ResourceBundle pour localiser les messages.

Création d'un logger : 

static Logger getAnonymousLogger()
Création d'un logger anonyme.
static Logger getAnonymousLogger(String resourceBundleName)
Création d'un logger anonyme.
static Logger getLogger(String nom)
Retourne ou crée le logger de nom nom.
static Logger getLogger(String name, String resourceBundleName)
Retourne ou crée le logger de nom nom.

Les méthodes : 

void setLevel(Level l)
Level getLevel()
Modifie ou retourne le niveau du logger
void addHandler(Handler h)
Handler[] getHandlers()
void removeHandler(Handler h)
Ajoute un handler,
retourne le tableau des handler affectés à ce logger,
supprime un handler.
void log(Level niveau, String msg) 
void log(Level niveau, String msg, Object param)
void log(Level niveau, String msg, Object[] params)
void log(Level niveau, String msg, Throwable thrown)
void log(LogRecord lr)
Envoi d'un message du niveau niveau.Lorsque le dernier paramètre est un objet Throwable, le nom de la classe , le message de l'objet Throwable, et la pile des appels de méthodes sont ajoutés au message. Toutes les méthodes d'envoi de message utilisent la dernière méthode pour configurer le message envoyé. les méthodes logp permettent de spécifier le nom de la classe et le nom de la méthode (si on ne veut pas les noms par défaut).
void severe(String msg)
void warning(String msg)
void info(String msg)
void config(String msg)
void fine(String msg)
void finer(String msg)
void finest(String msg)
Chaque méthode permet d'envoyer un message du niveau correspondant à son nom.
void entering(String nomClasse, String nomMethode)
void entering(String nomClasse, String nomMethode, Object p)
void entering(String nomClasse, String nomMethode, Object[] p)
void exiting(String nomClasse, String nomMethode)
void exiting(String nomClasse, String nomMethode, Object p)
Ces méthodes permettent d'envoyer de messages d'entrée ou de sortie de méthode. Attention, les messages envoyés sont de niveau level.FINER.

3 Les classes Handler

Les classes Handler sont les classes représentant les différents supports dans lesquels les messages sont écrits. Ces messages sont écrits en utilisant un Formatter. Les classes Handler ont un niveau : les messages d'un niveau inférieur ne sont pas pris en compte. Le format SimpleFormatter est le format par défaut d'un ConsoleHandler et le format XMLFormatter est le format par défaut de FileHandler et SoketHandler. Hiérarchie des Handler
Hiérarchie des Formatter

3.0 La classe FileHandler

Le constructeur de FileHandler est : 

 FileHandler(String pattern, int limit, int count, boolean append)

Dans un pattern on peut utiliser les symboles spéciaux suivants : 


Exemples

FileHandler fh =
       new FileHandler();
Création du fichier "java0.log" (0 ou un autre nombre entier) dans le répertoire donné par la propriété "user.home".
FileHandler fh = 
       new FileHandler("essai%u.log);
Création du fichier "essai0.log" (0 ou un autre nombre entier) dans le répertoire de travail.
FileHandler fh = 
       newFileHandler("essai%u.log", 200, 3);
Création des fichiers "essai0.log.0", éventuellement "essai0.log.1" et "essai0.log.2" dans le répertoire de travail.

Contenu du fichier log suivant le format
FileHandler fh = new FileHandler();
fh1.setFormatter(new XMLFormatter()))
FileHandler fh = new FileHandler();
fh1.setFormatter(new SimpleFormatter())
<?xml version="1.0" encoding="windows-1252" 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 

3.1 La classe SocketHandler

Le constructeur de SocketHandler est : 

 SocketHandler(String hote, intport)

Ceconstructeur réalise une connexion TCP sur la machine hote, et le port port : les messages seront ensuite envoyés sur ce socket.

3.22 La classe MemoryHandler

La classe MemoryHandler sert à spécifier un tampon mémoire qi est vidé dans un autre Handler.

3.3 La classe ConsoleHandler

La classe ConsoleHandler permet d'envoyer les messages de log à la console. Son niveau par défaut est Level.INFO.


4 La classe Formatter

La classe Formatter permet de formater l'affichage des informations dans le Handler

Exemple un Formatter qui produit du html : 

public class HTMLFormatter extends Formatter {
   // formatage d’une ligne
   public String format(LogRecord record) {
      StringBuffer s = new StringBuffer(1000);
      Date d = new Date(record.getMillis());
      DateFormat df = DateFormat.getDateTimeInstance(
                          DateFormat.LONG, DateFormat.MEDIUM, Locale.FRANCE);  
      s.append("<tr><td>" + df.format(d) + "</td>");
      s.append("<td><span  style=\"font-family:"+
               " Courier New,Courier,monospace; color: rgb(204, 0, 0);\">"+
               "<b>"+formatMessage(record) + 
               "</b></span></td></tr>\n");
      return s.toString();
   }
   // début du fichier de log
   public String getHead(Handler h) {
      return "<html>\n<body>\n<table>\n";
   }
   // fin du fichier de log
   public String getTail(Handler h) {
       return "</table>\n</body>\n</html>\n";
   }
}
Donne un fichier HTML qui a l'apparence suivante :
14 mai 2010 14:19:41 le message 1  
14 mai 2010 14:19:43 le message 2  
14 mai 2010 14:19:45 le message 3  

haut de la page