Як логувати повідомлення у різні файли

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

Як логувати повідомлення у різні файли

Фреймворк Symfony організовує повідомлення логів у канали. За замовчуванням, існує декілька каналів, включно з doctrine, event, security, request та інші. Канал друкується у повідомленні логу і може також бути використаний для спрямування різних каналів у різні місця/файли.

За замовчуванням, Symfony записує кожне повідомлення в один і той же файл (незалежно від каналу).

Note

Кожний канал відповідає сервісу логування (monolog.logger.XXX) у контейнері (використайте команду debug:container, щоб побачити повний перелік) і вони впроваджуються у різні сервіси.

Перемикання каналу на інший обробник

Тепер, уявіть, що ви хочете логувати канал security в інший файл. Щоб зробити це, створіть новий обробник та сконфігуруйте його, щоб він логував лише повідомлення з каналу security. Наступний приклад робить це лише у prod середовищі конфігурації , але ви можете зробити це у будь-якому (або всіх) середовищах:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# config/packages/prod/monolog.yaml
monolog:
    handlers:
        security:
            # логувати всі повідомлення (так як налагодження є найнижчим рівнем)
            level:    debug
            type:     stream
            path:     '%kernel.logs_dir%/security.log'
            channels: [security]

        # приклад *відсутності* локгування повідомлень каналу безпеки для цього обробника
        main:
            # ...
            # channels: ['!security']

Caution

Конфігурація channels працює лише для обробників найвищого рівня. Обробники, які вкладені у групу, буфер, фільтр, fingers crossed абощось подібне, ігноруватимуть цю конфігурацію та обробляти кожне передане їм повідомлення.

Ви можете вказати конфігурацію у багато способів:

1
2
3
4
5
6
7
channels: ~    # Включити всі канали

channels: foo  # Включити лише канал 'foo'
channels: '!foo' # Включити всі канали, окрім 'foo'

channels: [foo, bar]   # Включити лише канали 'foo' та 'bar'
channels: ['!foo', '!bar'] # Включити всі канали, окрім 'foo' та 'bar'

Створення вашого власного каналу

Ви можете змінити канал запиму логів Monolog по одному сервісу за раз. Це робиться за допомогою тегування вашого сервісу monolog.logger та вказання того, в якому каналі сервіс має записувати логи. З тегом, обробник логів, який впроваджується в сервіс, попередньо сконфігурований так, щоб використовувати канал, який ви вказали.

Конфігурація додаткових каналів без тегованих сервісів

Ви також можете сконфігурувати додаткові канали без необхідності тегувати ваші сервіси:

1
2
3
# config/packages/monolog.yaml
monolog:
    channels: ['foo', 'bar', 'foo_bar']

Symfony автоматично реєструє по одному сервісу на канал (у цьому прикладі, канал foo створює сервіс під назвою monolog.logger.foo). Для того, щоб впровадити цей сервіс у інші, ви повинні оновити конфігурацію сервісу, щоб обрати конкретний сервіс для впровадження .

Як автомонтувати канали логерів

Починаючи з MonologBundle 3.5, ви можете автомонтувати різні канали Monolog, додавши підказки у ваші аргументи сервісу з наступним синтаксисом: Psr\Log\LoggerInterface $<camelCased channel name> + Logger. <channel> має бути попередньо визначений у вашій конфігурації Monolog .

Наприклад, щоб впрповадити сервіс, повʼязаний з каналом логеру foo_bar, змініть ваш конструктор таким чином:

1
2
3
4
5
public function __construct(
-     LoggerInterface $logger,
+     LoggerInterface $fooBarLogger,
    ) {
    }

Конфігурація каналів логера з атрибутами

Починаючи з Monolog 3.5 ви також можете налаштувати канал логера використовуючи атрибут #[WithMonologChannel] безпосередньо у вашому класі сервіса:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// src/Service/MyFixtureService.php
namespace App\Service;

use Monolog\Attribute\WithMonologChannel;
use Psr\Log\LoggerInterface;
use Symfony\Bridge\Monolog\Logger;

#[WithMonologChannel('fixtures')]
class MyFixtureService
{
    public function __construct(LoggerInterface $logger)
    {
        // ...
    }
}

Таким чином, ви можете уникнути ручного призначення вашому сервісу використання певного каналу.

3.5

Атрибут #[WithMonologChannel] було представлено в Monolog 3.5.0.