Как сконфигурировать 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->isDebug()) {
        $output->writeln('Some info');
    }

    if ($output->isVerbose()) {
        $output->writeln('Some more info');
    }
}

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
// ...

class YourCommand extends Command
{
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->logger->debug('Some info');
        // ...
        $this->logger->notice('Some more info');
    }
}

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

Обработчик консоли Monolog по умолчанию включён:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    # config/packages/dev/monolog.yaml
    monolog:
        handlers:
            # ...
            console:
                type:   console
                process_psr_3_messages: false
                channels: ['!event', '!doctrine', '!console']
    
                # optionally configure the mapping between verbosity levels and log levels
                # 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
    <!-- config/packages/dev/monolog.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
    // config/packages/dev/monolog.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.