Как записать логи из одного сервиса в отдельный файл? - PullRequest
56 голосов
/ 17 ноября 2011

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

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

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

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

не в основной лог-файл.

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

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

Ответы [ 3 ]

79 голосов
/ 21 ноября 2011

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

Это может быть пример конфигурации (в 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, чтобы исключить некоторые и включить все остальное.

29 голосов
/ 17 ноября 2011

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

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

7 голосов
/ 10 августа 2016

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

monolog:
    channels: ['my_logger']

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

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

...