Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 2

Любая пользовательская команда, которая расширяет 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>

Ответ 3

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

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());
}

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

Ответ 4

В большинстве случаев ваша команда расширяет 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, в которой перечислены все службы в контейнере.

Удачи!

Ответ 5

Для 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.