Як сконфігурувати Monolog так, щоб він відображав консольні повідомлення

Дата оновлення перекладу 2024-05-29

Як сконфігурувати 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');

        return Command::SUCCESS;
    }
}

В залежності від рівня детальності, в якому виконується команда, і конфігурації користувача (див. нижче), ці повідомлення можуть бути відображені або не відображені у консолі. Якщо вони відображені, вони отримують відповідні часові відмітки та колір. Окрім того, логи помилок записуються у виведення помилок (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

Тепер повідомлення логів будуть відображені у консолі, засновуючись на рівнях логів та детальності. За замовчуванням (при нормальному рівні детальності), будуть відображені попередження та повідомлення вищого ранку. Але у режимі повної детальності будуть відображені всі повідомлення.