2011-11-17 9 views
53

Normalmente basta avere logger servizio, e tronchi vai a:Come scrivere i registri da un servizio in un file separato?

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

Vorrei registrare i messaggi formare servizi SOAP SOLO a:

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

non ai file di log principale.

Ho letto il ricettario, ma non capisco come configurare monolog.

Qualsiasi aiuto, indizi?

+0

Sono molto interessato alla risposta. Ho fatto una domanda simile qualche settimana fa: http://stackoverflow.com/questions/7714790/custom-monolog-logging-channel-in-symfony2-command – Reuven

risposta

74

MonologBundle registra tutto utilizzando gli stessi gestori per l'intero framework. Ciò significa che se uno dei tuoi servizi deve accedere a gestori diversi, è necessario creare il proprio Logger/Gestore e iniettarlo nel servizio.

Questo potrebbe essere un esempio di configurazione (in 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] 

Spero che questo chiarisce.

Update: Da symfony 2.1, è anche possibile configurare i canali di ricezione che i gestori, così si potrebbe in alternativa, fare qualcosa di simile:

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

che crea un nuovo canale di sapone (cioè logger esempio la ricezione di tutti i gestori), poi per configurare diversi gestori per questo canale:

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] 

questo significa che il gestore principale riceverà tutto, ma il canale di sapone, e il gestore di sapone riceveranno solo il modo canale ap. È anche possibile rimuovere la chiave channels sul gestore principale se si desidera che il proprio file di registro principale disponga di tutto, ma anche di avere una copia separata dei log del sapone separatamente. Questo porta molta flessibilità e, come vedi, i canali sono una matrice in modo da poter elencare i canali che desideri o utilizzare la notazione nera !name per escluderne alcuni e includere tutto il resto.

+0

Soluzione molto bella –

+0

Ottima soluzione! – AlterPHP

+2

I canali sono brutti culi –

27

Ho avuto un problema simile e ho scelto di utilizzare la libreria Monolog direttamente anziché il servizio Monolog.

Monolog utilizza Monolog\Handler\StreamHandler per scrivere su file. Il github page ha un semplice esempio:

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'); 

Potrebbe essere possibile utilizzare ancora il servizio e semplicemente spingere un nuovo gestore (e pop una volta che hai finito - altrimenti si potrebbe involontariamente scrivere più di quanto si voleva a il tuo log personalizzato) ma non l'ho testato. Onestamente sembrava più facile usare la libreria direttamente.

+2

Il pacchetto semplicemente non supporta altri modi di creare registri diversi da quelli basati al livello della registrazione. La tua soluzione è carina, ma probabilmente vale la pena registrare questo logger e il suo gestore all'interno del DIC, in modo da poterlo iniettare ovunque nel tuo modello. –

+1

Sarebbe davvero possibile semplicemente spingere il gestore e farlo scoppiare dopo l'esecuzione del materiale di sapone, ma in quel caso fare attenzione, il gestore che si spinge dovrebbe avere '$ bubble = false' passato al suo costruttore, altrimenti i precedenti gestori sarà ancora chiamato. Puoi anche spingere un NullHandler per sopprimere tutto, poi il tuo gestore per catturare solo i livelli a cui sei interessato. – Seldaek

+7

finalmente qualcosa di sano, grazie mille! –

5

Ho risolto lo stesso problema creando canali personalizzati in config.yml come spiegato in questo collegamento How to Log Messages to different Files.

monolog: 
    channels: ['my_logger'] 

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

Dopo questo, posso accedere al mio Looger con un servizio creato in modo dinamico chiamato monolog.logger.my_logger

Problemi correlati