当前位置: 首页 > 知识库问答 >
问题:

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

澹台新知
2023-03-14

我在symfony中创建了自定义日志处理程序。创建它不是问题,配置:配置/包/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::\uuu construct()的参数3必须实现接口OldSound\RabbitMqBundle\RabbitMq\producertinterface,给定字符串,在..中调用。。。。。

这是因为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;
    }
  ......

但我有一个错误:

参数1传递到App\Logger\AlertLogger::__construct()必须实现接口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个答案

孔寒
2023-03-14

Lucas,为了覆盖构造函数参数,您应该为其定义自定义构造函数,并为其配置服务定义(如果不是自动连接的话)。不幸的是,这会导致预定义功能的丢失(即级别设置在这里是无用的),因此您必须自己重新定义它。

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

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;
}

 类似资料:
  • 上下文是我一直在尝试为我的实体设置一个自定义循环引用处理程序,它将影响所有实体。 根据文件(https://symfony.com/doc/current/components/serializer.html#handling-循环引用),我们被引导在文件中的服务下设置值: 我的实际问题是,当序列化程序尝试加载循环引用处理程序时,我的覆盖似乎不存在:显示键引用的图像显示上下文为空 为什么我的超驰装

  • 可以通过实现接口或扩展任何现有的实现来创建自己的自定义处理程序。 在下面的示例中,我们通过扩展类创建了自定义处理程序。 为了理解上述与DBUtils相关的概念,让我们编写一个将运行读取查询的示例。 创建一个示例应用程序。 更新在DBUtils入门程序中创建的文件:MainApp.java。 按照下面的说明编译并运行应用程序。 以下是的内容。 以下是文件的内容。 以下是文件的内容。 完成创建源文件后

  • 我们可以通过实现ResultSetHandler接口或扩展ResultSetHandler的任何现有实现来创建我们自己的自定义处理程序。 在下面给出的示例中,我们通过扩展BeanHandler类创建了一个自定义处理程序EmployeeHandler。 要理解与DBUtils相关的上述概念,让我们编写一个运行读取查询的示例。 要编写我们的示例,让我们创建一个示例应用程序。 步 描述 1 更新在 DB

  • 问题内容: 我在以下两个问题中寻求您的帮助-如何为不同的日志级别(如python)设置处理程序。目前,我有 但是Scrapy生成的调试消息也会添加到日志文件中。这些时间非常长,理想情况下,我希望将DEBUG级别的消息保留在标准错误上,并将INFO消息转储到我的。 其次,在文档中,它说我的问题是,我应该在哪里运行它?它在我的蜘蛛里面吗? 问题答案: 嗯, 只是想更新一下,我能够使用来获取日志文件处理

  • 我想有一个共享的应用程序insights实例,将保存来自不同微服务运行的所有日志。 或者说,共享应用程序insights实例并将所有日志和遥测都放在一堆中是不是一个坏主意?

  • 问题内容: 谁能给我一个创建事件和处理程序的自定义集的示例。假设您有一个Person对象,您希望小部件知道它是否已更新。 您创建了一个HandlerManager,现在您必须创建一个Event和一个Handler。您将如何定义这些类,以便可以订阅和引发事件? 大多数事件都是基于DOM的,而我想创建一些自定义事件和处理程序,这些事件和处理程序可以在任何基于浏览器的事件之外触发。 问题答案: 这是一个