【问题标题】:Monolog handler ignoring yaml level忽略 yaml 级别的独白处理程序
【发布时间】:2019-09-13 01:58:07
【问题描述】:

在使用 Monolog 的 Symfony 4.3 中,我创建了一个自定义处理程序来将日志推送到 AWS Firehose。这是构造函数:

class FirehoseLogHandler extends AbstractProcessingHandler {

public function __construct(
        FirehoseClient $firehoseClient,
        FormatterInterface $formatter,
        $streamName,
        $level = Logger::INFO,
        $bubble = true
    ) {

        $this->firehoseClient = $firehoseClient;
        $this->streamName = $streamName;
        $this->formatter = $formatter;

        parent::__construct($level, $bubble);
    }

这是我的monolog.yaml 配置:

monolog:
  handlers:
    firehose_handler:
      type: service
      id: kinesis_stream_handler

    main:
      type: stream
      handler: firehose_handler
      level: error
      channels: ["!event"]

services:
  kinesis_stream_handler:
    class: App\Logger\Handler\FirehoseLogHandler
    arguments:
      $firehoseClient: '@aws.firehose'
      $formatter: '@App\Logger\Formatter\FirehoseLogFormatter'
      $streamName: 'firehose-stream-test'

我遇到的问题是$level 始终设置为Logger::INFO (200),或者在构造函数中设置的任何值。它似乎忽略了 yaml 配置中设置的内容。

我在这里做错了什么?我知道我总是可以将$level: 400 添加到服务声明中,但这似乎没有多大意义。提前感谢任何帮助。

【问题讨论】:

    标签: symfony logging monolog


    【解决方案1】:

    定义为type: service 的处理程序严格按原样使用,因为它们是您已经构建的实例。它们没有从主独白配置中传递任何参数;这仅适用于它为您构建的服务。因此,出于这个原因,您确实需要将 $level 作为显式参数添加到您的自定义处理程序中。

    您的main 处理程序定义可能会导致进一步的混淆。虽然handler 是一个有效的配置键,但它不适用于stream 处理程序,因为它只对包装其他处理程序有意义,例如filter。所以这只是被忽略了。

    可在代码here 中找到处理程序类型的完整列表以及实际适用于每种类型的配置键。

    【讨论】:

    • 谢谢斯蒂芬。很好的解释。只是为了让我理解这一点,没有真正的方法可以扩展 Monolog 以创建新的处理程序 type?
    • 没有。这必须添加到 monolog-bundle 配置类中,据我所知,并没有真正干净的方法来扩展它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2012-10-07
    • 1970-01-01
    • 2015-02-02
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多