Подтвердить что ты не робот

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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, чтобы исключить некоторые из них и включить все остальное.

Ответ 2

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

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

Ответ 3

Я решил ту же проблему, создав пользовательские каналы в 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