Monolog处理程序忽略Yaml级别

时间:2019-09-13 01:58:07

标签: symfony logging monolog

在使用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,但这似乎没有多大意义。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

定义为public class HomeController : Controller { private readonly IConfiguration _configuration; public HomeController IConfiguration configuration) { _configuration = configuration; } public IActionResult Index { var modelinstance = new FilteringRequest(_configuration);//create the viewmodel with default 'Type" return View(); } } 的处理程序严格按原样使用,因为它们是您已经构造的实例。没有从主独白配置中传递任何参数。仅适用于为您构建的服务。因此,出于这个原因,您确实需要将type: service作为显式参数添加到自定义处理程序中。

您的$level处理程序定义可能还会引起进一步的混乱。尽管main是有效的配置密钥,但它不适用于handler处理程序,因为它仅对包装其他程序的处理程序有意义,例如stream。因此,这只是被忽略。

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