2015-02-19 7 views
5

Ich stehe vor einigen Problemen mit der Konfiguration von Monolog für "verschachtelte Protokollierer".Monolog: Protokollieren verschiedener Kanäle und mehrerer Handler zu gruppierten Protokolldateien + dedizierten Protokolldateien

Was ich tun möchte:

Log von Dienstleistungen für spezielle Dateien (eine pro-Dienst) UND von allen Dienstleistungen in einer Datei. Jeder Logger sollte auch von monolog.handlers.console behandelt werden.

Warum will ich

Jeder Dienst Logik zu tun hat, aber auch andere Leistungen von DI verwenden kann. Ich möchte wissen, was genau ein Dienst protokolliert, daher möchte ich für jeden Dienst eine dedizierte Protokollfunktion (mit benutzerdefiniertem Kanal und benutzerdefinierter Protokolldatei). Aber Wenn Dienste auf andere Dienste angewiesen sind, möchte ich Protokolle in chronologischer Reihenfolge in einer Datei lesen.

Was ich habe

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 } 

Es funktioniert nicht wie erwartet. Es protokolliert zu my_service.log, aber nicht zu my.log.

Gibt es die Möglichkeit zu erreichen, was ich will?

+0

Haben Sie das Problem gelöst? –

+0

Noch nicht, ich hatte nicht genug Zeit, um damit zu experimentieren. – Wirone

+0

Es wird Ihr Problem nicht lösen, aber können Sie einige Zeit sparen und Log-Handling Erfahrung zu verbessern, versuchen Sie https://www.loggly.com/ – lchachurski

Antwort

4

Kanäle in Monolog funktioniert genau wie Sie möchten. Beispiel Monolog Konfiguration

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"   

Wenn Sie Code hinzufügen, wie

$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"); 

Sie erhalten 3-Log-Dateien mit einem solchen Inhalt

Kanal Protokolldatei

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 

Standard env log Datei

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 [] {"...."} 

Kurz 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 

Beachten Sie auch, dass wegen der stop_buffering: falsche Mitteilung nach Fehler nicht bei dev.log erscheinen, dev_brief.log, wird aber bei DELETION.LOG erscheinen

Und Sie sollten Sentry versuchen - sein tolles Produkt und seine Besitzer sind coole Jungs :)

+0

Ja, ich dachte, es wäre besser, MonologBundle's config zu verwenden (Handler mit definierten Channels), aber vorausgesetzt DI config war schon da (existierende App, vorheriger Entwickler hatte eigene Konventionen) und ich wollte es nicht so sehr umgestalten. Aber es scheint, als wäre es nur ein Weg. Vielen Dank für Ihr Beispiel, ich werde es versuchen (wir haben ausstehende Problem über Logger Refactoring). – Wirone

+0

Nach wirklich langer Zeit habe ich es endlich geschafft, unsere Logger mit MonologBundle's Config zu refactorieren und ja, alles kann mit Handler-Stacks erreicht werden. Es ist manchmal nicht intuitiv, aber es gibt eine Vielzahl von Handlern, Prozessoren und Formatierern, so dass jeder Protokolldatensatz dorthin gelangen kann, wo Sie möchten. Vielen Dank. – Wirone

Verwandte Themen