Symfony2/Monolog: Log Level - показывать только app.INFO?

Я использую Symfony2 и monolog для записи в определенных журналах в определенный файл журнала (mylogfile.log):

#config_dev.yml
monolog:
    handlers:
        main:
           type:  stream
           path:  %kernel.logs_dir%/%kernel.environment%.log
           level: debug
       file:
           type:   stream
           path:   %kernel.logs_dir%/mylogfile.log
           level:  info

Я получаю доступ к лог-файлу в моем контроллере через:

    $logger = $this->get('logger'); // Log
    $logger->info('somelogcontent');

Теперь моя проблема заключается в том, что мой файл журнала содержит весь информационный уровень, то есть он дает мне все журналы app.INFO (что мне и нужно) и request.INFO (который мне на самом деле не нужен):

[2012-04-04 11:13:17] request.INFO: Matched route ... blablabla
[2012-04-04 11:13:17] app.INFO: somelogcontent
...

Есть ли способ не войти в журнал Request.INFO?

Майк

4 ответа

Решение

Вы должны сделать новый сервис регистрации, который должен использоваться в ваших классах. Вот так, config.yml:

services:
  my_logger:
    class: Monolog\Logger
    arguments: [my_info]
    calls:
        - [pushHandler, [@my_log_handler]]

  my_log_handler:
    class: Monolog\Handler\StreamHandler
    arguments: [%kernel.root_dir%/logs/my_info.log, 100]

Использование (в Controller, например):

$this->get('my_logger')->info('info message');

Более подробная информация в кулинарной книге Symfony.

С версией 2.4 и выше (будьте осторожны, цикл выпуска MonologBundle больше не синхронизируется с Symfony) MonologBundle, теперь вы можете определять новые каналы очень просто с помощью конфигурации, без определения служб.

monolog:
    channels: ["my_channel"]
    handlers:
       file:
           type:   stream
           path:   %kernel.logs_dir%/mylogfile.log
           level:  info
           channels: my_channel

Теперь просто получите автоматически созданный регистратор для нового канала в вашем контроллере:

$logger = $this->get('monolog.logger.my_channel');
$logger->info('somelogcontent');

Я знаю старый вопрос, но эта новая особенность от MonologBundle~2.4 следует упомянуть.

Вы можете уровень оповещения пользователя. файл: тип: путь потока: %kernel.logs_dir%/mylogfile.log уровень: предупреждение

$logger = $this->get('logger'); // Log
$logger->alert('somelogcontent');

Это сообщение журнала поступает от службы router_listener. Вы можете переопределить его в файле конфигурации услуг.

Что я сделал в своем основном комплекте config/services.yml:

services:

    # ...

    router_listener:
        class:  %router_listener.class%
        arguments: ['@router', %request_listener.http_port%, %request_listener.https_port%]
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onEarlyKernelRequest }
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

Из-за этого сообщения журнала "Matched route ..." не регистрируются (так как RouterListener не имеет службы ведения журнала в своих аргументах конструктора).

Добавьте в файл config\packages\monolog.yaml специальный канал "app"

monolog:
    handlers:
        info:
            type:  rotating_file
            path:  '%kernel.logs_dir%/info_%kernel.environment%_info.log'
            level: info
            max_files: 10
            channels: app

Я использую Symfony 4 (или 5)

Добавьте в конфигурацию монолога, например, если я использую обработчик:test

test:
    type: filter
    accepted_levels: [info]
    handler: test_info
test_info:
    type: stream // many possibilities(rotating_file..)
    level: info
    path: // the path where you save file log
Другие вопросы по тегам