fbpx

Besoin d’un logger? Utilisez Log4php!

L’un des problèmes communs quand on développe une application, ou quand on intégre différents composants, est le logging. On veut avoir des niveaux de logging différents. On veut aussi pouvoir loguer sur le système de fichiers,  envoyer des emails pour les problèmes plus urgents etc. Pour développer un systeme pareil from scratch, j’imagine que la tache ne sera pas aussi simple.

En effet, il existe Deja un framework Complet pour la gestion de cette tache, le projet Apache Log4php! Log4php est écrit PHP . Les habitués de Java et .Net reconnaîtront tout de suite le modèle, Log4php est en fait un portage de Log4j et Log4Net déjà existants dans ces deux langages. Éventuellement, le framework présente les memes notions et fonctionnalités.
Regardons ce que Log4php sait faire et comment l’utiliser :

Fonctionnalités

  • Configuration via des fichiers XML ou ini avec la même structure que Log4j
  • Gestion de loggers hiérarchiques
  • Support de logging sur : fichier, fichier journalier, console, mail, pdo, erreurs php, logs système ou évènements NT (windows), sockets.
  • Rotation de logs
  • Layouts standard : Simple, TTCC, Pattern, HTML et XML
  • gestion d’erreurs hiérarchiques : log, warn, error, fatal etc.

Installation

  • Telecharger Log4php et decompressez le.
  • Copier le repertoire  src/main/php dans votre application
  • include/require la classe Logger (log4php/Logger.php) dans vos scripts

Comment ca marche?

Loggers, Appenders and Layouts

Log4php possède trois composants principaux: les loggers,  les appenders et les layouts.

  • Les loggers s’occupent de loguer les messages selon le type de message et le niveau de loging.
  • Les appenders quant a eux, déterminent ou le logging se fait (fichier, mail, bd etc.).
  • Enfin, les Layouts permettent de formater les messages rapportés.

Exemples

Exemple de base

Voici un exemple de base d’un logger qui affiche les résultats en console et expose les méthodes pouvant etre appelées sur un logger :

   require_once('log4php/Logger.php');
  $logger = Logger::getLogger("main");
  $logger->info("foo");
  $logger->warn("bar");
  $logger->error("urgent");
  $logger->fatal("Fatal!");

Ce code affiche

Wed Nov 24 20:40:10 2010 [10093] INFO main - foo
Wed Nov 24 20:40:10 2010 [10093] WARN main - bar
Wed Nov 24 20:40:10 2010 [10093] ERROR main - urgent
Wed Nov 24 20:40:10 2010 [10093] FATAL main - Fatal!

Utiliser un fichier de configuration

log4php.appender.default = LoggerAppenderEcho
    log4php.appender.default.layout = LoggerLayoutSimple
    log4php.rootLogger = WARN, default
    log4php.logger.mylogger = INFO, default
    log4php.additivity.mylogger = "false"

Il est possible de définir une configuration dans un fichier ini. La configuration qui suit spécifie que l’appender par défaut utilisera la console (LoggerAppenderEcho) et un template (LoggerLayoutSimple). Le logger par défaut (rootLogger) loguera les messages a partir du niveau WARNING (et donc pas les message INFO). Un autre logger “myLogger” s’occupera de loguer les messages INFO. L’information additivity.mylogger = false indique que le niveau de propagation de l’erreur ne va pas en dessous du logger mylogger (Par defaut, le message se propage aux parents du logger).
Sauvegardez ces lignes en un fichier ini – disons config.ini – et appelez le depuis votre code. Voici un exemple :

  require_once('log4php/Logger.php');
  Logger::configure('config.ini');

  class MyClass {
     private $logger;

     public function __construct() {
         $this->logger = Logger::getLogger(__CLASS__);
         $this->logger->debug('Dans le constructeur!');
     }
  } 

  $logger = Logger::getLogger('main');
  $logger->info('Warning externe');

  new MyClass();

Ceci affiche :

  DEBUG - Dans le constructeur!

Vous remarquerez que l’appel d’un logger non déclaré (‘main’ dans l’exemple) appellera le rootLogger. Aussi, vous remarquerez l’instanciation du logger en se servant de __CLASS__. De cette façon vous pouvez avoir un logger différent pour chacune de vos classes.

Héritage et niveaux de logs

Héritage de logs

Il est possible de faire heriter des loggers en utilisant des points comme separateurs dans les noms de logs (foo, foo.bar, foo.bar.x etc.). Le logger root est le parent de la hiérarchie, il est toujours présent et ne peut pas etre appelé par nom. pour l’appeler, utilisez plutot la méthode statique getRootLogger.

Niveaux de logs

Log4php permet de gérer cinq niveaux de base de logging : DEBUG, INFO, WARN, ERROR et FATAL. Log4php assume que ces niveaux sont ordonnés de cette facon :
DEBUG < INFO < WARN < ERROR < FATAL. Prenons un exemple :

   // Recurperer une instance appelee “com.foo”
   $logger = Logger::getLogger(“com.foo”);

   // setLevel permet de setter le niveau de logging, Normalement
   // Vous n’avez pas a indiquer ceci programaticallement, vous
   // le faites plutot dans un fichier de configuration
   $logger->setLevel(LoggerLevel::INFO);

   // com.foo.Bar herite de com.foo
   $barlogger = Logger::getLogger(“com.foo.Bar”);

   // on peut executer la methode warn puisque  WARN >= INFO.
   $logger->warn(“Warning message”);

   // On ne peux pas executer cette methode puisque DEBUG < INFO.    $logger->debug(“Debug message”);

   // $barlogger (com.foo.Bar) va heriter son niveau de $logger (com.foo)
   // donc, la methode info pourra etre appelee puisque INFO >= INFO
   $barlogger->info(“Informations”);

   // De meme pour barlogger, cette methode ne peux pas etre appelee puisque DEBUG < INFO.    $barlogger->debug(“Exiting gas station search”);

Conclusion

Le présent tutoriel a été fortement inspiré par la documentation officielle. Vous trouverez des explications et des exemples plus complets sur les différentes notions sur le site officiel.
Log4php est un framework complet et qui suit les standards de logging. Aussi, il est supporté par Apache, ce qui vous donne une confiance d’utilisation. J’ai commencé a l’intégrer pour la prochaine version de Simple MVC et je peux vous dire que c’est du pur plaisir! A utiliser sans hésitation!

Liens

Téléchargement : http://logging.apache.org/log4php/download.html
Documentation : http://logging.apache.org/log4php/docs/introduction.html

Anis Berejeb

Anis est avant tout un passioné de l'agilité et du développement. Avec plus de 15 ans dans le domaine du développement web, son expertise combine des connaissances accrues dans l'ensemble des notions partant du développement logiciel jusqu'à l'organisation des équipes dans les environnements agiles à grande échelle.

You may also like...