9.Créer un fichier de logs/traces

9.1.Introduction

Parmi les options possibles pour logger des informations dans un fichier, celle qui semble la plus pertinente est de faire appel à une classe implémentant les recommandations PSR-3[c'est quoi?] définies par le PHP Framework Interop Group.
Vous noterez que nous parlons essentiellement de stockage dans un fichier mais un logger est en fait une classe qui permet d'envoyer un message à qui veut bien le recevoir. Il peut ainsi être stocké dans un fichier certes, mais il peut aussi bien être envoyé dans la sortie standard (i.e. bien souvent affiché à l'écran), il peut être stocké en base, envoyé par mail, traité par un autre processus, etc.
Les messages peuvent très bien être envoyés à plusieurs destinations différentes. Pour chacune des destinations, il est possible de filtrer les messages qui seront envoyés notamment sur la base de leur criticité (information, erreur, problème critique, etc.).

9.2.Le standard PSR-3

9.2.1.Interfaces PSR-3

Une classe implémentant une interface LoggerInterface telle que définie dans la PSR-3 contient 8 méthodes pour loguer avec différents niveaux de criticités (eux même définis par la RFC 5424).
Une alternative possible à l'utilisation de ces méthodes consiste à faire appel à la méthode log() avec pour premier paramètre le niveau de criticité (parmi les 8 prévus et pour lesquels des constantes de classe ont été définies dans Psr\Log\LogLevel.
Ces méthodes sont donc:
  • emergency(...) équivalent à log(LogLevel::EMERGENCY, ...)
  • alert(...) équivalent à log(LogLevel::ALERT, ...)
  • critical(...) équivalent à log(LogLevel::CRITICAL, ...)
  • error(...) équivalent à log(LogLevel::ERROR, ...)
  • warning(...) équivalent à log(LogLevel::WARNING, ...)
  • notice(...) équivalent à log(LogLevel::NOTICE, ...)
  • info(...) équivalent à log(LogLevel::INFO, ...)
  • debug(...) équivalent à log(LogLevel::DEBUG, ...)
Ces 8 méthodes acceptent 2 paramètres:
  • Un message
  • Un context (a priori optionnel)
La méthode log() accepte ces 2 mêmes paramètres mais attend en plus en premier paramètre le niveau de criticité comme indiqué précédemment.

9.2.2.Exemples d'utilisation

Nous n'aborderons pas encore le sujet de l'instanciation de l'objet implémentant LoggerInterface (tout dépend de la bibliothèque choisie) mais nous y reviendrons plus tard. A supposer qu'un objet $logger a été instancié, il sera alors possible de faire des appels du genre:
<?php
    $logger->debug('L\'utilisateur est autorisé à réaliser l'opération de suppression');
    $logger->debug('L\'utilisateur {utilisateur} est autorisé à réaliser l'opération de suppression',
                   ['utilisateur' => 'Durand']);
    
Comme vous pouvez le voir, il est non seulement possible de loguer un message mais ce message peut également être construit en précisant des mots clés et en accompagnant ce message d'un tableau contenant des valeurs associées à ces mots clés (ici 'utilisateur').
Actuellement, les principales implémentations de Logger (monolog et zend-log) ne traitent pas par défaut ce type de substitution. Il faudra activer ce mode pour en profiter (comme nous le verrons plus tard).

9.2.3.Gestion des flux de sortie

La "norme" PSR-3 ne donne aucune indication sur la marche à suivre pour déclarer/configurer les flux de sortie des Loggers mais le principal général reste le même d'une implémentation à l'autre.
Une fois l'objet implémentant LoggerInterface instancié, il faudra lui ajouter des flux de sortie (fichier, sortie standard, base de données, etc.) en précisant pour chaque quel niveau de logs on souhaite. On pourra ainsi choisir d'envoyer tous les messages ou uniquement ceux de criticité au moins égale à WARNING par exemple.

9.2.4.Les implémentations

Maintenant les grandes lignes précisées, il est grand temps de passer au concret avec des implémentations de cette "norme".
Nous allons donc vous présenter: