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

53

Обычно вы получаете услугу logger, а журналы:

%kernel.root_dir%/%kernel.environment%.log

Я хотел бы регистрировать сообщения из SOAP-сервисов ТОЛЬКО:

%kernel.root_dir%/%kernel.environment%.soap.log

не для основного файла журнала.

Я читал поваренную книгу, но я не понимаю, как настроить монолог.

Любая помощь, подсказки?

  • 0
    Я очень заинтересован в ответе. Я задал похожий вопрос несколько недель назад: stackoverflow.com/questions/7714790/…
Теги:
logging
monolog

3 ответа

73
Лучший ответ

MonologBundle записывает все, используя одни и те же обработчики для всей структуры. Это означает, что если одному из ваших сервисов необходимо подключиться к различным обработчикам, вы должны создать свой собственный Logger/Handler и ввести его в свою службу.

Это может быть пример config (в yaml):

services:
    my_logger:
        class: Symfony\Bridge\Monolog\Logger
        arguments: [soap]
        calls:
            - [pushHandler, [@my_handler]]

    my_handler:
        class: Monolog\Handler\StreamHandler
        # 200 = INFO, see Monolog::Logger for the values of log levels
        arguments: [%kernel.root_dir%/%kernel.environment%.soap.log, 200]

    soap_service:
        class: Your\Soap\Client
        arguments: [@my_logger]

Надеюсь, это прояснит это.

Обновление:, как и в Symfony 2.1, вы также можете настроить, какие каналы будут получать эти обработчики, чтобы вы могли сделать что-то вроде этого:

services:
     soap_service:
         class: Your\Soap\Client
         arguments: [@logger]
         tags:
             - { name: monolog.logger, channel: soap }

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

monolog:
    handlers:
        main:
            type: stream
            path: %kernel.root_dir%/%kernel.environment%.log
            level: error
            channels: [!soap]
        soap:
            type: stream
            path: %kernel.root_dir%/%kernel.environment%.soap.log
            level: info
            channels: [soap]

Это означает, что основной обработчик получит все, кроме канала мыла, и обработчик мыла получит только мыльный канал. Вы также можете удалить клавишу channels на основном обработчике, если вы хотите, чтобы ваш основной файл журнала имел все, но также имеет копию только журналов мыла отдельно. Это приносит большую гибкость, и, как вы видите, каналы представляют собой массив, поэтому вы можете перечислить нужные вам каналы или использовать нотацию черного списка !name, чтобы исключить некоторые из них и включить все остальное.

  • 0
    Очень хорошее решение
  • 0
    Очень хорошее решение!
Показать ещё 1 комментарий
26

У меня была аналогичная проблема, и я решил использовать библиотеку Monolog напрямую вместо службы Monolog.

Монолог использует Monolog\Handler\StreamHandler для записи в файлы. страница github имеет простой пример:

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));

// add records to the log
$log->addWarning('Foo');
$log->addError('Bar');

Возможно, вам удастся использовать службу и просто нажать новый обработчик (и вытащить его, как только вы закончите), в противном случае вы можете случайно написать больше, чем вы хотели, чтобы ваш собственный журнал), но я не тестировал этот, Честно говоря, было проще просто использовать библиотеку напрямую.

  • 2
    Пакет просто не поддерживает другие способы создания журналов, отличных от уровня ведения журнала. Ваше решение неплохое, но, вероятно, стоит зарегистрировать этот регистратор и его обработчик внутри DIC, чтобы вы могли внедрить его где угодно в вашей модели.
  • 1
    В самом деле, можно было бы просто нажать на обработчик и вытолкнуть его после выполнения мыльных вещей, но в этом случае будьте осторожны, обработчику, который вы нажимаете, нужно передать $bubble = false в его конструктор, иначе предыдущие обработчики все равно будут называется. Вы также можете сначала нажать NullHandler, чтобы подавить все, затем свой собственный обработчик, чтобы поймать только те уровни, которые вас интересуют.
Показать ещё 3 комментария
5

Я решил ту же проблему, создав пользовательские каналы в config.yml, как описано в этой ссылке Как записывать сообщения в разные файлы.

monolog:
    channels: ['my_logger']

    handlers:
        my_logger:
            level:    debug
            type:     stream
            path:     '%kernel.logs_dir%/my_logger.log'
            channels: [my_logger]

После этого я могу получить доступ к моему looger с динамически созданной службой с именем monolog.logger.my_logger

Ещё вопросы

Сообщество Overcoder
Наверх
Меню