Loguer des messages dans un fichier spécifique avec Symfony2 et Monolog

Les fichiers de logs de Symfony sont très utiles pour comprendre ce qu’il se passe dans votre application et la débuguer. Je m’en sers constamment, la configuration de base répondant à mes besoins, jusqu’ici.

Travaillant sur un service de synchronisation très sensible il est intéressant d’y loguer ce qu’il s’y passe (quand la synchronisation commence, qui la déclenche, quels sont les éléments synchronisés, etc.). dans un fichier dédié, pour plus de clarté.

Pour loguer dans un fichier autre que ceux par défaut (dev.log, prod.log et test.log) il existe une documentation qui pour moi n’est pas des plus détaillée. Pourtant, une fois le mécanisme compris l’écriture de logs Symfony dans d’autres fichiers est des plus simple.

Partons du service de synchronisation suivant :

<?php 
class SynchronizerService
{
    /** @var LoggerInterface $logger */
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @param SynchronizationItem[] $synchronizationItems
     */
    public function sync($synchronizationItems)
    {
        $this->logger->notice('Synchronization started.');
    }
}

L’idée d’un service étant qu’il soit réutilisable partout, les dépendances sont injectées dans le constructeur et celles-ci sont le plus génériques possible. Ce n’est pas parce que le logger par défaut de Symfony2 est Monolog que notre service doit en dépendre.

Mon premier point de blocage à ce stade fut le suivant : comment faire à partir de LoggerInterface pour spécifier le fichier dans lequel écrire ? Réponse : on ne fait pas. Tout se passe dans la configuration du service et de Monolog.

La définition du SynchronizerService est classique, à l’exception de la présence d’un tag :

# services.yml
foo.sync.synchronizer:
  class: Foobar\SyncBundle\Service\SynchronizerService
  arguments:
    - "@logger"
  tags:
    - { name: monolog.logger, channel: sync }

Les tags portent bien leur nom puisqu’ils vous permettent de taguer vos services au même titre que des articles de blogs. On peut parler de catégorisation également. Pour plus d’information sur les tags, une page de documentation dédiée est disponible.

Maintenant que l’injection du logger est faite et que le service est tagué la dernière étape est de configurer Monolog afin d’utiliser un nouvel handler :

# config.yml    
monolog:
  handlers:
    sync:
      type: stream
      path: "%kernel.logs_dir%/sync_%kernel.environment%.log"
      level: debug
      channels: ['sync']   

La propriété qui nous intéresse ici est « channels ». Elle indique au handler quels channels écouter, ou plus simplement quels tags écouter.

La configuration est finie, la prochaine fois que vous exécuterez le service un nouveau fichier de log commencant par « sync_ » sera créé, en fonction de l’environnement dans lequel il est exécuté.

Commentaires

  1. ayoub

    Bonjour, Merci beaucoup pour l’article il m’est très utile, cependant, tu n’a pas mis l’écriture de message pour ce chanel spécifique ???

Ajouter un commentaire