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