пользовательский канал регистрации монолога в команде symfony2

В этой статье поваренной книги мы можем увидеть, как использовать пользовательский канал в службе. Но как я могу использовать пользовательский канал входа в команде?

Я создал команду symfony2 для выполнения чего-то. Я хотел бы использовать монолог для регистрации вещей, сделанных моей командой.

На самом деле, я хочу записать журнал для моей команды в другой файл, кроме журналов приложения.

Любая пользовательская команда, которая расширяет ContainerAwareCommand , имеет доступ к контейнеру службы Symfony. Вы можете определить службу, которая регистрируется в настраиваемом канале в вашей конфигурации.

 <services> <service id="console.logger" parent="monolog.logger_prototype"> <argument index="0">mychannel</argument> </service> </services> 

Вы можете получить доступ к своей службе из команды следующим образом

 $logger = $this->getContainer()->get('console.logger'); 

Этот регистратор будет регистрироваться с каналом как «mychannel».

FYI Журналы службы регистрации по умолчанию для канала «приложение». Это можно увидеть в файле Symfony/Bundle/MonologBundle/Resources/config/monolog.xml . Это также место, где определена служба logger по умолчанию.

 <services> <service id="monolog.logger" parent="monolog.logger_prototype" public="false"> <argument index="0">app</argument> </service> <service id="logger" alias="monolog.logger" /> <service id="monolog.logger_prototype" class="%monolog.logger.class%" abstract="true"> <argument /><!-- Channel --> </service> </services> 

Аналогичный вопрос был задан и ответил здесь:

Как записывать журналы из одной службы в отдельный файл?

благодаря

Попробуйте это, используйте библиотеку напрямую

 use Monolog\Logger; use Monolog\Handler\StreamHandler; // ... // create a log channel $log = new Logger('name'); $log->pushHandler(new StreamHandler('path of log file', Logger::WARNING)); //add the erros to log file try { //do something } catch(Exception $e) { $log->addError($e->getMessage()); } 

Возможно, это может решить вашу проблему, добавить это в свой командный файл.

В большинстве случаев ваша команда расширяет ContainerAwareCommand (см. Здесь: http://symfony.com/doc/current/cookbook/console.html#creating-a-basic-command ).

Это означает, что ваша команда имеет доступ к контейнеру обслуживания Symfony – который представляет собой большой пакет всех сервисов внутри Symfony (то есть полезных объектов). В вашем случае вам понадобится служба logger , которую вы можете получить, вытащив ее из контейнера:

 $logger = $this->getContainer()->get('logger'); 

(ссылка: http://symfony.com/doc/current/cookbook/console.html#getting-services-from-the-service-container )

Теперь вы можете использовать регистратор как обычно. Если вам понадобятся какие-либо другие службы, просто зайдите в команду php app/console container:debug , в которой перечислены все службы в контейнере.

Удачи!

Для Symfony 3.3 из-за служб autowire, когда вы хотите входить в отдельный файл, следуйте этому подходу:

Предположим, например, что нам нужно зарегистрировать 2 вращающихся файла:

  • exception.log : для исключений, вызванных в приложении.
  • dataFetch.log : для вызовов api tha извлекает данные приложений.

The on services.yml put:

 monolog: channels: ['dataFetch', 'exception'] handlers: dataFetch: type: 'rotating_file' level: info type: stream path: 'dataFetch.log' max_files: 7 channels: dataFetch exception: type: 'rotating_file' level: error type: stream path: 'exception.log' max_files: 7 channels: exception 

Теперь для логина исключения вы можете добавить зависимость от monolog.logger.exception тогда как для dataFetch вы можете использовать приложение monolog.logger.dataFetch .