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

Дата обновления перевода 2023-09-19

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

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

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

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

protected function execute(InputInterface $input, OutputInterface $output): int
{
    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
23
// src/Command/YourCommand.php
namespace App\Command;

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
{
    public function __construct(
        private LoggerInterface $logger,
    ) {
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $this->logger->debug('Some info');
        $this->logger->notice('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
23
// src/Command/YourCommand.php
namespace App\Command;

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). Больше нет необходимости управлять настройками детальности в зависимости от определённых условий.

LoggerInterface ??????????? ????????? ??????
->error() OutputInterface::VERBOSITY_QUIET stderr
->warning() OutputInterface::VERBOSITY_NORMAL stdout
->notice() OutputInterface::VERBOSITY_VERBOSE -v
->info() OutputInterface::VERBOSITY_VERY_VERBOSE -vv
->debug() OutputInterface::VERBOSITY_DEBUG -vvv

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

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']

            # опционально сконфигурируйте связь между уровнями детальности и уровнями логов
            # verbosity_levels:
            #     VERBOSITY_NORMAL: NOTICE

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