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

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

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

Note

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

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

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

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    # config/packages/monolog.yaml
    monolog:
        handlers:
            security:
                # логировать все сообщения (так как отладка - нижайший уровень)
                level:    debug
                type:     stream
                path:     '%kernel.logs_dir%/security.log'
                channels: [security]
    
            # пример *отсутствия* логирования сообщений канала безопасности для этого обработчика
            main:
                # ...
                # channels: ['!security']
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <!-- config/packages/monolog.xml-->
    <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
            http://symfony.com/schema/dic/monolog
            http://symfony.com/schema/dic/monolog/monolog-1.0.xsd">
    
        <monolog:config>
            <monolog:handler name="security" type="stream" path="%kernel.logs_dir%/security.log">
                <monolog:channels>
                    <monolog:channel>security</monolog:channel>
                </monolog:channels>
            </monolog:handler>
    
            <monolog:handler name="main" type="stream" path="%kernel.logs_dir%/main.log">
                <!-- ... -->
                <monolog:channels>
                    <monolog:channel>!security</monolog:channel>
                </monolog:channels>
            </monolog:handler>
        </monolog:config>
    </container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // config/packages/monolog.php
    $container->loadFromExtension('monolog', array(
        'handlers' => array(
            'security' => array(
                'type'     => 'stream',
                'path'     => '%kernel.logs_dir%/security.log',
                'channels' => array(
                    'security',
                ),
            ),
            'main'     => array(
                // ...
                'channels' => array(
                    '!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
    1
    2
    3
    # config/packages/monolog.yaml
    monolog:
        channels: ['foo', 'bar']
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- config/packages/monolog.xml -->
    <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
            http://symfony.com/schema/dic/monolog
            http://symfony.com/schema/dic/monolog/monolog-1.0.xsd">
    
        <monolog:config>
            <monolog:channel>foo</monolog:channel>
            <monolog:channel>bar</monolog:channel>
        </monolog:config>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    // config/packages/monolog.php
    $container->loadFromExtension('monolog', array(
        'channels' => array(
            'foo',
            'bar',
        ),
    ));
    

Таким образом, вы теперь можете отправлять сообщения логов в канал foo, используя автоматически зарегистрированный сервис обработчика логов monolog.logger.foo.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.