Как сконфигурировать Monolog так, чтобы он отображал конспольные сообщения

Консоль возможно использовать для печати сообщений для определённых уровней детальности, используя экземпляр OutputInterface, который передаётся при выполнении команды.

Когда должно произойти много логирования, печать информации в зависимости от настроек детальности (-v, -vv, -vvv) становится громоздкой, так как вызовы должны быть обёрнуты в условия. Код быстро становится детальным или грязным. Например:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

protected function execute(InputInterface $input, OutputInterface $output)
{
    if ($output->getVerbosity() >= OutputInterface::VERBOSITY_DEBUG) {
        $output->writeln('Some info');
    }

    if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
        $output->writeln('Some more info');
    }
}

Вместо того, чтобы использовать эти семантические методы для тестирования каждого из уровней детальности, MonologBridge предоставляет ConsoleHandler, который слушает консольные собтия и записывает сообщения логов в вывод консоли, в зависимости от текущего уровня логов и детальности косоли.

Пример выше можно переписать таким образом:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

protected function execute(InputInterface $input, OutputInterface $output)
{
    // предполагая, что команда расширяет ContainerAwareCommand...
    $logger = $this->getContainer()->get('logger');
    $logger->debug('Some info');

    $logger->notice('Some more info');
}

В зависимости от уровня детальности, в котором выполняется команда, и конфигурации пользователя (см. ниже), эти сообщения могут быть отображены или не отображены в консоли. Если они отображены, они получают соответствующие метки времени и цвет. Кроме того, логи ошибок записываются в вывод ошибок (php://stderr). Больше нет необходимости управлять настройками детальности в зависимости от определённых условий.

Обработчик консоли Monolog по умолчанию включён в фреймворке Symfony. Например, в config_dev.yml:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    # app/config/config_dev.yml
    monolog:
        handlers:
            # ...
            console:
                type:   console
                process_psr_3_messages: false
                channels: ['!event', '!doctrine', '!console']
    
                # по желанию сконфигурируйте маршрут между уровнми детальности и логов
                # verbosity_levels:
                #     VERBOSITY_NORMAL: NOTICE
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <!-- app/config/config.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:monolog="http://symfony.com/schema/dic/monolog"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <monolog:config>
            <!-- ... -->
    
            <monolog:handler name="console" type="console" process-psr-3-messages="false">
                <monolog:channels>
                    <monolog:channel>!event</monolog:channel>
                    <monolog:channel>!doctrine</monolog:channel>
                    <monolog:channel>!console</monolog:channel>
                </monolog:channels>
            </monolog:handler>
        </monolog:config>
    </container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    // app/config/config.php
    $container->loadFromExtension('monolog', array(
        'handlers' => array(
            'console' => array(
               'type' => 'console',
               'process_psr_3_messages' => false,
               'channels' => array('!event', '!doctrine', '!console'),
            ),
        ),
    ));
    

Теперь сообщения логов будут отображены в консоли, основываясь на уровнях логов и детальности. По умолчанию (при нормальном уровне детальности), будут показаны пердупреждения и сообщения более высокого ранга. Но в режиме полной детальности, будут отбражены все сообщения.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.