web-dev-qa-db-fra.com

Comment écrire des journaux d'un service dans un fichier séparé?

Normalement, vous obtenez simplement le service logger, et les journaux vont à:

%kernel.root_dir%/%kernel.environment%.log

Je voudrais enregistrer les messages sous forme SOAP services SEULEMENT à:

%kernel.root_dir%/%kernel.environment%.soap.log

pas au fichier journal principal.

J'ai lu le livre de recettes, mais je ne comprends pas comment configurer monolog.

Une aide, des indices?

57
canni

Le MonologBundle enregistre tout en utilisant les mêmes gestionnaires pour l'ensemble du framework. Cela signifie que si l'un de vos services doit se connecter à différents gestionnaires, vous devez créer votre propre enregistreur/gestionnaire et l'injecter dans votre service.

Cela pourrait être un exemple de configuration (en yaml):

services:
    my_logger:
        class: Symfony\Bridge\Monolog\Logger
        arguments: [soap]
        calls:
            - [pushHandler, [@my_handler]]

    my_handler:
        class: Monolog\Handler\StreamHandler
        # 200 = INFO, see Monolog::Logger for the values of log levels
        arguments: [%kernel.root_dir%/%kernel.environment%.soap.log, 200]

    soap_service:
        class: Your\Soap\Client
        arguments: [@my_logger]

J'espère que cela clarifie les choses.

pdate: à partir de symfony 2.1, vous pouvez également configurer quels canaux reçoivent quels gestionnaires, vous pouvez donc faire quelque chose comme ceci:

services:
     soap_service:
         class: Your\Soap\Client
         arguments: [@logger]
         tags:
             - { name: monolog.logger, channel: soap }

Ce qui crée un nouveau canal soap (c'est-à-dire une instance de logger recevant tous les gestionnaires), puis de configurer différents gestionnaires pour ce canal:

monolog:
    handlers:
        main:
            type: stream
            path: %kernel.root_dir%/%kernel.environment%.log
            level: error
            channels: [!soap]
        soap:
            type: stream
            path: %kernel.root_dir%/%kernel.environment%.soap.log
            level: info
            channels: [soap]

Cela signifie que le gestionnaire principal recevra tout sauf le canal de savon et que le gestionnaire de savon ne recevra que le canal de savon. Vous pouvez également supprimer la clé channels du gestionnaire principal si vous souhaitez que votre fichier journal principal contienne tout, mais également avoir une copie des journaux de savon séparément. Cela apporte beaucoup de flexibilité, et comme vous le voyez, les canaux sont un tableau afin que vous puissiez lister les canaux que vous voulez, ou utiliser la liste noire !name notation pour en exclure certains et inclure tout le reste.

79
Seldaek

J'ai eu un problème similaire et j'ai choisi d'utiliser la bibliothèque Monolog directement au lieu du service Monolog.

Monolog utilise Monolog\Handler\StreamHandler pour écrire dans des fichiers. La page github a un exemple simple:

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));

// add records to the log
$log->addWarning('Foo');
$log->addError('Bar');

Il peut être possible de continuer à utiliser le service et de simplement pousser un nouveau gestionnaire (et de le faire apparaître une fois que vous avez terminé - sinon vous pourriez par inadvertance écrire plus que vous ne le vouliez dans votre journal personnalisé), mais je n'ai pas testé cela. Honnêtement, il semblait plus facile d'utiliser directement la bibliothèque.

29
Steven Mercatante

J'ai résolu le même problème en créant des canaux personnalisés dans config.yml comme expliqué dans ce lien Comment enregistrer des messages dans différents fichiers .

monolog:
    channels: ['my_logger']

    handlers:
        my_logger:
            level:    debug
            type:     stream
            path:     '%kernel.logs_dir%/my_logger.log'
            channels: [my_logger]

Après cela, je peux accéder à mon looger avec un service créé dynamiquement nommé monolog.logger.my_logger

7
Genoud Magloire