2015-02-19 11 views
5

Sono di fronte ad alcuni problemi con la configurazione di Monolog per gestire "logger annidati".Monolog: registra diversi canali e più gestori per file di registro raggruppati + file di registro dedicati

quello che voglio fare:

Log dai servizi ai file dedicati (uno per il servizio) E da tutti i servizi di un unico file. Ogni logger dovrebbe essere gestito anche da monolog.handlers.console.

per questo che voglio fare

Ogni servizio ha logica, ma possono utilizzare altri servizi da DI. Voglio sapere che cosa registra esattamente un servizio, quindi voglio logger dedicato (con canale personalizzato e file di registro personalizzato) per ogni servizio. Ma quando i servizi si basano su altri servizi, voglio leggere i registri in ordine cronologico in un unico file.

Quello che ho

app/config.yml:

monolog: 
    handlers: 
     my_handler: 
      type:  stream 
      path:  %kernel.logs_dir%/%kernel.environment%.my.log 
      level: info 
      handler: my_bundle_handler 

src/My/Bundle/Resources/config/config.yml

services: 
    # LOGGERS 
    my_logger: 
     class: Symfony\Bridge\Monolog\Logger 
     arguments: [my_logger] 
     calls: 
      - [pushHandler, [@monolog.handler.console]] 
      - [pushHandler, [@my_bundle_handler]] 
     tags: 
      - { name: monolog.logger, channel: my_channel} 

    # HANDLERS 
    my_bundle_handler: 
     abstract: true # Without it it will throw exception 
     type: group 
     members: [my_service_handler] 
     channels: ["my_channel"] 
     tags: 
      - { name: log_handler } 

    my_service_handler: 
     class: Monolog\Handler\StreamHandler 
     arguments: [%kernel.logs_dir%/%kernel.environment%.my_service.log, 100] 
     channels: ["my_channel"] 
     tags: 
      - { name: log_handler } 

non funziona come previsto. Si registra su my_service.log, ma non su my.log.

C'è possibilità di ottenere ciò che voglio?

+0

Hai risolto il problema? –

+0

Non ancora, non ho avuto abbastanza tempo per sperimentarlo .. – Wirone

+0

Non risolverà il problema, ma potrebbe farti risparmiare tempo e migliorare l'esperienza di gestione dei registri, prova https://www.loggly.com/ – lchachurski

risposta

4

I canali in monolog funzionano esattamente come si desidera. Esempio monologo configurazione

app/config.yml 

monolog: 
    channels: ['deletion'] 
    handlers: 
    main: 
     type:   fingers_crossed 
     action_level: error 
     handler:  grouped_main 
     formatter: "monolog.formatter.request" 
     buffer_size: 30 
#  if you will set stop_buffering: true - you will get ALL events after first error. It could produce huge logs for console 
     stop_buffering: false 

# this is for getsentry.com error catching 
    sentry: 
     type: raven 
     dsn: '%sentry_url%' 
     level: notice 

    # Groups 
    grouped_main: 
     type: group 
     members: [sentry, streamed_main, streamed_main_brief] 

    # Streams 
    streamed_main: 
     type: stream 
     path: "%kernel.logs_dir%/%kernel.environment%.log" 

    streamed_main_brief: 
     type: stream 
     path: "%kernel.logs_dir%/%kernel.environment%_brief.log" 
     formatter: monolog.brief_formatter 

    console: 
     type: console 
     formatter: monolog.console_formatter 

    deletion: 
     # log deletion related messages 
     level: debug 
     type:  stream 
     path:  '%kernel.logs_dir%/deletion.log' 
     channels: ['deletion'] 
     formatter: monolog.brief_formatter 

services: 
    my_service: 
     class: Monolog\Processor\IntrospectionProcessor 
     tags: 
      - { name: monolog.processor } 
    monolog.console_formatter: 
     class: Symfony\Bridge\Monolog\Formatter\ConsoleFormatter 
     arguments: 
      - "<fg=black;bg=green>[%%datetime%%]</fg=black;bg=green> %%start_tag%%%%message%%%%end_tag%%\n" 
    monolog.brief_formatter: 
     class: Monolog\Formatter\LineFormatter 
     arguments: 
      - "[%%datetime%%] %%message%%\n" 
#   default format is 
#   - "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"   

Se si aggiungerà il codice come

$this->getContainer()->get("logger")->info("Sample info"); 
$this->getContainer()->get("monolog.logger.deletion")->info("Deletion channel info"); 
$this->getContainer()->get("monolog.logger.deletion")->error("Deletion channel error"); 
$this->getContainer()->get("monolog.logger.deletion")->info("Deletion channel info #2"); 

Otterrete 3 file di log con un tale contenuto

file di log Canale

deletion.log 
[2016-11-11 12:43:18] Deletion channel info 
[2016-11-11 12:43:18] Deletion channel error 
[2016-11-11 12:43:19] Deletion channel info #2 

predefinito registro ENV file

dev.log 
[2016-11-11 12:43:18] event.DEBUG: Notified event "console.command" to listener "Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure". [] {"file":"...."} 
[2016-11-11 12:43:18] event.DEBUG: Notified event "console.command" to listener "Symfony\Bridge\Monolog\Handler\ConsoleHandler::onCommand". [] {"file":"...."} 
[2016-11-11 12:43:18] app.INFO: Sample info [] {"file":"..."} 
[2016-11-11 12:43:18] deletion.INFO: Deletion channel info [] {"file":"...."} 
[2016-11-11 12:43:18] deletion.ERROR: Deletion channel error [] {"...."} 

Breve env.log

[2016-11-11 12:43:18] Notified event "console.command" to listener "Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure". 
[2016-11-11 12:43:18] Notified event "console.command" to listener "Symfony\Bridge\Monolog\Handler\ConsoleHandler::onCommand". 
[2016-11-11 12:43:18] Sample info 
[2016-11-11 12:43:18] Deletion channel info 
[2016-11-11 12:43:18] Deletion channel error 

anche notare, che a causa della stop_buffering: true preavviso dopo errore non apparirà dev.log, dev_brief.log, ma apparirà in deletion.log

E dovresti provare la sentinella - il suo ottimo prodotto ei suoi proprietari sono ragazzi fantastici :)

+0

Sì, ho pensato che sarebbe stato meglio usare la configurazione di MonologBundle (gestori con canali definiti), ma avevamo già configurato la configurazione di DI (app esistente, lo sviluppatore precedente aveva alcune convenzioni) e non volevo rifattenerlo più di tanto. Ma sembra che sia l'unico modo. Grazie mille per il tuo esempio, ci proverò (abbiamo in sospeso il problema del refactoring dei logger). – Wirone

+0

Dopo molto tempo sono finalmente riuscito a refactoring i nostri logger con la configurazione di MonologBundle e sì, tutto può essere raggiunto con stack di gestori. A volte non è intuitivo, ma ci sono un sacco di gestori, processori e formattatori pronti all'uso in modo che ogni record di log possa andare dove vuoi tu. Grazie. – Wirone

Problemi correlati