В этой статье поваренной книги мы можем увидеть, как использовать пользовательский канал в службе. Но как я могу использовать пользовательский канал входа в команде?
Я создал команду 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
.