Обычно вы получаете услугу logger
, а журналы:
%kernel.root_dir%/%kernel.environment%.log
Я хотел бы регистрировать сообщения из SOAP-сервисов ТОЛЬКО:
%kernel.root_dir%/%kernel.environment%.soap.log
не для основного файла журнала.
Я читал поваренную книгу, но я не понимаю, как настроить монолог.
Любая помощь, подсказки?
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
, чтобы исключить некоторые из них и включить все остальное.
У меня была аналогичная проблема, и я решил использовать библиотеку 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');
Возможно, вам удастся использовать службу и просто нажать новый обработчик (и вытащить его, как только вы закончите), в противном случае вы можете случайно написать больше, чем вы хотели, чтобы ваш собственный журнал), но я не тестировал этот, Честно говоря, было проще просто использовать библиотеку напрямую.
$bubble = false
в его конструктор, иначе предыдущие обработчики все равно будут называется. Вы также можете сначала нажать NullHandler, чтобы подавить все, затем свой собственный обработчик, чтобы поймать только те уровни, которые вас интересуют.
Я решил ту же проблему, создав пользовательские каналы в 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