Symfony. Логирование с помощью Monolog

Написана 11 Октября, 2013 в 17:20. Автор: borN_free   |   Теги: symfony, monolog, elastica Комментарии 0

Расскажу, как настроить логирование в Symfony на примере ElasticaBundle (поисковый движок).

Для начала, полезные ссылки:

Итак, задача: логировать все, что касатеся поискового движка Elastica в отдельный файл, как в dev окружении, так и в prod. При этом кроме записываемых данных, необходимо сохранять URL, IP пользователя, HTTP метод.

Если вы прочитали вышеприведённые ссылки, то создать свой логгер с определенным каналом (channel) можно с помощью сервиса:

your_app.monolog_web_processor:
    class: Symfony\Bridge\Monolog\Logger # or YourApp\YourBundle\Logger\ElasticaLogger
    tags:
        - { name: monolog.logger, channel: elastica }

В этом случае, мы сможем получить наш логгер, уже сформированный для канала elastica, так:

...
$logger = $this->get('monolog.logger.elastica');
...

Отлично :) Но при такой конфигурации логирование у нас будет происходить в стандартные файлы: dev.log или prod.log.

Настройка файлов

Настройку файлов производим в config_dev.yml и config_prod.yml. Приведу пример только config_dev.yml:

monolog:
    handlers:
        elastica:
            type:  stream
            path:  %kernel.logs_dir%/elastica_sf_%kernel.environment%.log
            level: debug
            channels: elastica
        main:
            type:  stream
            path:  %kernel.logs_dir%/%kernel.environment%.log
            level: debug
        firephp:
            type:  firephp
            level: info
        chromephp:
            type:  chromephp
            level: info

Здесь мы добавили свой обработчик elastica - всё остальное стандартное.

  • type: stream - запись будет производиться в файл
  • channels: elastica - вот это самая важная настройка. Мы говорим Monolog, что данный хендлер должен обрабатывать только канал elastica.

Все, теперь наши сообщения будут записываться в нужный нам файл.

Настройка дополнительных данных

Для того, чтобы автоматически добавлять в лог данные о запросе, есть в Monolog встроенный процессор - WebProcessor, давайте добавим его:

your_app.monolog_web_processor:
    class: Monolog\Processor\WebProcessor
    tags:
        - { name: monolog.processor, channel: elastica }

Теперь к нашему каналу для каждой записи будет автоматически добавляться полезная информация. Все просто :).

Пробуем логировать:

public function indexAction()
{
    // ...
    $logger = $this->get('monolog.logger.elastica');
    $logger->debug(
        'Process object: find in Percolator',
        ['id' => $entity->getId()]
    );
}

Пример лога:

// %path_to_app/app/logs/elastica_sf_dev.log%
[2013-10-11 20:01:27] elastica.DEBUG: Process object: find in Percolator {"id":1} {"url":"/app_dev.php/broker/object/edit/1","ip":"127.0.0.1","http_method":"POST","server":"rees","referrer":"http://rees/app_dev.php/broker/object/edit/1"}
[2013-10-11 20:01:36] elastica.DEBUG: Replaced object {"id":1} {"url":"/app_dev.php/broker/object/edit_additional/1","ip":"127.0.0.1","http_method":"POST","server":"rees","referrer":"http://rees/app_dev.php/broker/object/edit_additional/1"}
[2013-10-11 20:01:36] elastica.DEBUG: Process object: find in Percolator {"id":1} {"url":"/app_dev.php/broker/object/edit_additional/1","ip":"127.0.0.1","http_method":"POST","server":"rees","referrer":"http://rees/app_dev.php/broker/object/edit_additional/1"}

Оставьте свой комментарий:

Поля с * обязательны.