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


обычно вы просто получаете logger сервис, и журналы перейти к:

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

Я хотел бы регистрировать сообщения из SOAP services только to:

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

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

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

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

3 55

3 ответа:

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

это может быть пример конфигурации (в 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 }

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

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]

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

у меня была аналогичная проблема, и я решил использовать библиотеку 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');

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

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

monolog:
    channels: ['my_logger']

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

после этого, я могу получить доступ к моей looger с динамически созданный сервисом монолог.логгер.my_logger