Как записывать логи сообщений в разные файлы

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

Как записывать логи сообщений в разные файлы

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

По умолчанию, Symfony записывает каждое сообщение в один и тот же файл (не зависимо от канала).

Note

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

Переключение канала на другой обработчик

Теперь, представьте, что вы хотите логировать канал security в другой файл. Чтобы сделать это, создайте новый обработчик и сконфигурируйте его так, чтобы он записывал только сообщения из канала security. Следующий ример делает это только в prod окружении конфигурации , но вы можете сделать это в любом (или всех) окружениях:

  • YAML
  • XML
  • PHP
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 работает только для обработчиков высшего уровня. Обработчики, которые вложены в группу, буфер, фильтр, авось или что-либо подобное, будут игнорировать эту конфигурацию и обрабатывать каждое переданное им сообщение.

Спецификация YAML

Вы можете указать конфигурацию во многих формах:

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 и указания того, в каком канале сервис должен записывать логи. С тегом, обработчик логов, который внедряется в сервис, предварительно сконфигурирован так, чтобы использовать канал, который вы указали.

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

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

  • YAML
  • XML
  • PHP
1
2
3
# config/packages/prod/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)
+     public function __construct(LoggerInterface $fooBarLogger)
    {
        $this->logger = $fooBarLogger;
    }