我已经在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”没有类型提示,您应该显式配置其值。
答案 0 :(得分:0)
Lucas,为了覆盖构造函数参数,您应该为其定义自定义构造函数并配置服务定义(如果未自动装配)。不幸的是,这会导致失去预定义功能(即level
设置在这里没有用),因此您必须自己重新定义。
如果处理程序定义为服务,则实际上不会以任何方式处理
您可以尝试发布构造函数和服务定义,以获取有关其状态的更具体的答案。乍一看,我建议您已经手动创建了服务定义,并且忘记了@
符号。只是一个猜测。
编辑:
应该是
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;
}