2016-03-28 4 views
4

я работаю на веб-приложение Symfony 2 и я хотел бы, чтобы ввести регистратор Монолог с использованием определенного канала к услуге:Symfony 2: Инъекция регистратор для конкретного канала/обработчиком услуги

The Config:

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

Service Config:

services: 
    some_service: 
    class: Some\Service 
    arguments: [@logger] 
    tags: 
     - { name: monolog.logger, channel: alert }  

служба:

class SomeService { 
    protected $logger; 

    public function __construct($logger) { 
     $this->logger = $logger; 
     $this->logger->info('Log this!'); 
    } 

Файл prod.log:

[2016-03-28 11:25:47] alert.INFO: бревенчатый это!

Проблема: Хотя я специально впрыскивать регистратор с использованием alert канала, сообщение обрабатывается main обработчика. Таким образом, сообщения записываются в файл prod.log вместо файла prod.alert.log.

Когда я оставляю строку channels: [!alert] в качестве комментария, сообщение регистрируется prod.log. Когда я активирую эту строку, удаляя комментарий, сообщение не регистрируется вообще (основной обработчик правильно игнорирует канал).

Для чего нужен я, чтобы использовать определенный обработчик для таргетинга на определенный файл журнала, почтовую программу и т. Д.? Сообщения для канала alert должны обрабатываться обработчиком alert, а все остальные обработчики игнорируются.

ответ

2

Используйте специальный сервис, созданный для Monolog обработчика:

services: 
    some_service: 
     class: Namespace\Some\Service 
     arguments: ["@monolog.logger.alert"]