Я хочу сменить канал Monolog. Мои объявления работают с некоторыми классами, но никогда с контроллерами.
Вот мое новое объявление канала админ:
#config/packages/dev/monolog.yaml
monolog:
handlers:
admin:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%-admin.log"
level: debug
channels: ["admin"]
Я успешно использую его с моим Authenticator, добавляя тег:
#config/services.yaml
# The form guard authenticator for the admin access
app.security.admin_authenticator:
class: App\Security\AdminAuthenticator
autowire: true
tags:
- { name: monolog.logger, channel: admin}
Последняя строка файла services.yaml выполняет свою работу, мой Authenticator больше не регистрируется в канале приложение, он регистрируется в канале админ.
Теперь я хочу использовать этот канал с контроллерами в подкаталоге Admin, поэтому я добавляю аналогичный тег в свое объявление:
#config/services.yaml
App\Controller\Admin\:
resource: '../src/Controller/Admin'
tags:
- 'controller.service_arguments'
- { name: monolog.logger, channel: admin}
Но вроде нет никакого воздействия. Я все еще вхожу в канал приложение. (Я сделал некоторую проверку, например, обновил кеш). Я не нахожу своей ошибки.




Не могу разобраться с методом тега. Однако вы можете определить свой канал монолога как аргумент конструктора вашего контроллера:
# monolog package configuration
monolog:
channels: [ 'admin' ]
handlers:
admin:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%-admin.log"
level: debug
channels: ["admin"]
Конфигурация автоматической проводки:
#config/services.yaml
App\Controller\Admin\:
resource: '../src/Controller/Admin'
arguments:
$logger: '@monolog.logger.admin'
tags:
- 'controller.service_arguments'
И в ваших контроллерах
/**
* SecurityController constructor.
* @param LoggerInterface $logger
*/
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
Да, это работает. Но я думаю, что добавлять конструктор в контроллер - не лучшая практика. Итак, я реализую LoggerAwareInterface и вызываю метод setLogger в services.yaml. Решение, предложенное mrbm, работает с тегом.
Я не пробовал это, но, скорее всего, потому, что ваш контроллер не поддерживает LoggerAwareInterface, поэтому тег регистратора не влияет.
Проверьте, какой интерфейс реализует AdminAuthenticator (чтобы увидеть, как настраивается регистратор), затем проделайте то же самое с контроллером, который должен работать.
#services.yaml
App\Controller\Admin\:
resource: '../src/Controller/Admin'
calls:
- [ setLogger, [ '@logger' ] ]
tags:
- 'controller.service_arguments'
- { name: monolog.logger, channel: admin}
Спасибо за вашу помощь. Завтра утром протестирую!
Даже если я реализую LoggerAwareInterface, тег регистратора не повлияет. Поэтому я буду использовать решение @MatMouth. Но я не буду использовать конструктор. Я вызову setLogger и реализую LoggerAwareInterface с объявлением в services.yaml.
Тег будет считан регистратором в любом случае, при реализации LoggerAwareInterface вам, возможно, придется выполнить подключение вручную, например: добавление - [ setLogger, [ '@logger' ] ] в calls: непосредственно перед tags
Спасибо за вашу помощь. Завтра утром протестирую!