Пользовательский канал регистрации монологов в команде symfony2 - PullRequest
15 голосов
/ 10 октября 2011

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

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

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

Ответы [ 5 ]

6 голосов
/ 23 января 2013

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

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

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 голосов
/ 21 ноября 2011

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

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

Спасибо

0 голосов
/ 17 ноября 2017

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

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

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

Вкл. services.yml поставить:

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.

0 голосов
/ 10 октября 2011

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

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...