Symfony自定义日志处理程序服务调用

时间:2018-10-06 20:07:37

标签: symfony logging containers handler monolog

我已经在symfony中创建了自定义日志处理程序。创建它不是问题,配置:config / packages / dev / monolog.yaml

monolog:
    handlers:
     ....
        alerts:
            type: service
            id: App\Logger\AlertLogger
            channels: [app]
            level:  warning

我的服务:

<?php

namespace App\Logger;
use Monolog\Handler\AbstractProcessingHandler;
class AlertLogger extends AbstractProcessingHandler
{
    protected function write(array $record)
    {
        // handle log
    }
}

但是问题是我想将此日志发送到RabbitMQ并在Consumer中执行某些操作,但是无法调用任何其他服务。我试图将其传递给构造器,但出现类似以下错误:

  

传递给App \ Logger \ AlertLogger :: __ construct()的参数3必须实现OldSound \ RabbitMqBundle \ RabbitMq \ ProducerInterface接口,给定字符串,在...中调用。

那是因为在AbstractProcessingHandler中有一个构造定义。

===============编辑:我的测试:

父类的构造函数:

public function __construct($level = Logger::DEBUG, $bubble = true)
{
    $this->setLevel($level);
    $this->bubble = $bubble;
}

我试图将日志处理程序作为服务添加到services.yaml:

services:
    .....
    App\Logger\AlertLogger:
        arguments:
            $producer: OldSound\RabbitMqBundle\RabbitMq\Producer

还有我的日志处理程序:

...
class AlertLogger extends AbstractProcessingHandler
{
    /**
     * @var ProducerInterface
     */
    private $producer;
    public function __construct(ProducerInterface $producer)
    {
        $this->producer = $producer;
    }
  ......

但是我收到此错误:

  

传递给App \ Logger \ AlertLogger :: __ construct()的参数1必须实现OldSound \ RabbitMqBundle \ RabbitMq \ ProducerInterface接口,给出字符串,在

中调用

当我尝试设置构造参数时:

....
class AlertLogger extends AbstractProcessingHandler
{
    /**
     * @var ProducerInterface
     */
    private $producer;
    public function __construct($level, $bubble, ProducerInterface $producer)
    {
        parent::__construct($level, $bubble);
        $this->producer = $producer;
    }
.....

我遇到错误:

  

无法自动装配服务“ App \ Logger \ AlertLogger”:方法“ __construct()”的参数“ $ level”没有类型提示,您应该显式配置其值。

1 个答案:

答案 0 :(得分:0)

Lucas,为了覆盖构造函数参数,您应该为其定义自定义构造函数并配置服务定义(如果未自动装配)。不幸的是,这会导致失去预定义功能(即level设置在这里没有用),因此您必须自己重新定义。

如果处理程序定义为服务,则实际上不会以任何方式处理

https://github.com/symfony/monolog-bundle/blob/master/DependencyInjection/MonologExtension.php#L131-L135

您可以尝试发布构造函数和服务定义,以获取有关其状态的更具体的答案。乍一看,我建议您已经手动创建了服务定义,并且忘记了@符号。只是一个猜测。

编辑:

应该是

services:
    .....
    App\Logger\AlertLogger:
        arguments:
            $level: 'warning'
            $bubble: true
            $producer: "@OldSound\RabbitMqBundle\RabbitMq\Producer"

使用构造函数

/**
 * @var ProducerInterface
 */
private $producer;
public function __construct($level, $bubble, ProducerInterface $producer)
{
    parent::__construct($level, $bubble);
    $this->producer = $producer;
}