Symfony 2.1 - Переключить канал Monolog в контроллере

Я хочу войти в другой файл, отличный от обычного dev.log или prod.log

Я знаю, что это можно сделать с разными каналами, и я использовал это в нескольких сервисах, но я не очень понимаю, как переключать канал Monolog в контроллере.

В службе вы просто определяете канал через атрибут tags в определении службы, но как я могу сделать это в контроллере или, что еще лучше, в конкретном действии?

Я знаю, что возможное решение было бы таким:

Но кажется излишним определять две новые службы только для ведения журнала в пользовательский файл.


person Johannes Klauß    schedule 12.04.2013    source источник


Ответы (3)


Единственный способ сделать это — определить ваш контроллер как службу и внедрить пользовательский регистратор с настраиваемым каналом.

Поскольку каналы создаются автоматически, другого пути на данный момент нет, но это интересный запрос, и вы не первый, поэтому я создал выпуск на MonologBundle, чтобы разрешить определение каналов на уровне конфигурации пакета. Таким образом, вы могли бы просто получить правильный регистратор из контроллера, используя $this->get('monolog.logger.mychannel') (что вы уже можете сделать, если канал существует, но не в том случае, если вам нужен пользовательский канал для контроллера, который больше ничего не использует).

Обновление:

Начиная с symfony/monolog-bundle 2.4.0 вы можете определить дополнительные каналы как:

monolog:
    channels: ["foo", "bar"]

Затем вы можете получить его как $this->get('monolog.logger.mychannel')

person Seldaek    schedule 12.04.2013
comment
@JohannesKlauß предстоящий выпуск пакета, который я сделаю завтра, включает правильное исправление для этого, кстати. - person Seldaek; 30.07.2013

Я знаю, что это старый пост, но я столкнулся с похожей необходимостью, используя symfony/monolog-bundle 2.1.x. Кажется, я не мог найти именно то, что мне было нужно в других потоках, поэтому я документирую здесь свое решение, которое заключалось в создании контейнера регистратора, который использовал пользовательский канал.

В config.yml

monolog:
    handlers:
        user_actions:
            type: stream 
            path:  "%kernel.logs_dir%/%kernel.environment%-user-actions.log"
            level: info 
            channels: [user_actions]

В моем пакете services.yml

acme.logger.user_actions:
    class: Acme\MyBundle\Monolog\UserActionsLogger
    arguments: ['@logger']
    tags:
        - { name: monolog.logger, channel: user_actions }

В src/Acme/MyBundle/Monolog/UserActionsLogger.php

<?php

namespace Acme\MyBundle\Monolog;

class UserActionsLogger
{
    public $logger;

    public function __construct($logger)
    {
        $this->logger = $logger;
    }
}

Затем вы можете внедрить контейнер регистратора в другую службу с помощью:

acme.user.authenticationhandler:
    class: %acme.user.authenticationhandler.class%
    public: false
    arguments:  ['@router', '@security.context', '@acme.logger.user_actions']

Или вы можете выборочно использовать контейнер логгера в качестве службы в любом контроллере:

$userActionsLogger = $this->get('acme.logger.user_actions');

Затем вы можете получить доступ к фактическому регистратору:

$userActionsLogger->logger->info('A thing happened!')
person elchivo1250    schedule 06.02.2015

В настоящее время я использую symfony/monolog-bundle 2.3.0, и следующий код работает.

Конфигурация в config.yml

monolog:
    handlers:
        main:
            type:  stream
            path:  %kernel.logs_dir%/%kernel.environment%.log
            level: info
        doctrine:
            type:  stream
            path:  %kernel.logs_dir%/doctrine_%kernel.environment%.log
            level: debug
            channels: doctrine

На контроллерах

$doctrineLogger = $this->get('monolog.logger.doctrine');

Надеюсь, поможет.

person Sergio Romano    schedule 23.11.2013
comment
Это работает, не хватает только channels: ['doctrine'] перед обработчиками - person kunicmarko20; 28.10.2016