【问题标题】:Monolog - logging only specific level of errorsMonolog - 仅记录特定级别的错误
【发布时间】:2018-04-15 22:22:15
【问题描述】:

我在原生 PHP 应用程序中使用 Monolog。

我只想记录特定级别的错误 - INFO 和 不高于,因为我有其他处理程序。

这是我的代码:

<?php
$logger = new Logger('mylogger');
$logger->pushHandler(new StreamHandler(__DIR__.'/log/errors.log', Logger::WARNING));
$logger->pushHandler(new StreamHandler(__DIR__.'/log/info.log', Logger::INFO));

有什么方法可以只将 INFO 消息记录到info.log

【问题讨论】:

    标签: php monolog


    【解决方案1】:

    我今天遇到了同样的问题,导致我来到这里。无论如何,我通过使用 Monologs FilterHandler 解决了它。

    FilterHandler 允许您将另一个处理程序作为参数传递,然后指定将触发该处理程序的最小和最大日志记录级别。

    few other handlers 在特定情况下很有用。

    // Create the logging instance
    $logger = new \Monolog\Logger('myLogger');
    
    // Create error stream handler for error events and higher
    $errorStreamHandler = new \Monolog\Handler\StreamHandler(
        'Some/DirectoryPath/error.log',
        \Monolog\Logger::ERROR);
    
    // Create info stream handler for info events and higher
    $infoStreamHandler = new \Monolog\Handler\StreamHandler(
        'Some/DirectoryPath/Info.log',
        \Monolog\Logger::INFO);
    
    // Create filter handler to make sure info stream only logs info events
    // Pass in the info handler 
    // Debug is the minimum level this handler will handle
    // Info is the maximum level this handler will handle
    $infoFilterHandler = new \Monolog\Handler\FilterHandler(
        $infoStreamHandler,
        \Monolog\Logger::DEBUG,
        \Monolog\Logger::INFO);
    
    // Add the handlers to logger
    $logger->pushHandler($errorStreamHandler);
    $logger->pushHandler($infoFilterHandler);
    
    // Yay no errors in Info.log
    $logger->addError("Some Error");
    $logger->addInfo("Some Info");
    

    更新阿里 请参考 \Monolog\Logger 的source code 查找可用的常量,然后将常量分配给变量。

    $someVar = \Monolog\Logger::INFO;
    
    $infoStreamHandler = new \Monolog\Handler\StreamHandler(
        'Some/DirectoryPath/Info.log',
        $someVar);
    

    【讨论】:

    • 其他(更明确的)方式是:$infoFilterHandler = new \Monolog\Handler\FilterHandler($infoStreamHandler, [\Monolog\Logger::INFO]);
    • 如何使用变量来定义上述代码中的日志级别?
    • 为了澄清@MiguelPynto 的评论,FilterHandler 的第二个参数接受单个值作为 MINIMUM 日志记录级别,或处理程序仅处理的显式级别列表。
    【解决方案2】:

    bubble 参数设置为false

    $logger->pushHandler(new StreamHandler(__DIR__.'/log/info.log', Logger::INFO, false));
    

    【讨论】:

    • 这其实是最好的答案
    【解决方案3】:

    基于@Sasha Vas 的回答。

    Monologs StreamHandler 有一个气泡参数,可以完全按照您的意愿行事,避免日志冒泡到其他级别。

    在 Laravel 5.6 之后,这个未记录的功能也可用。

    这就是我的channels 之一的样子:

    'warning' => [
                'driver' => 'single',
                'level' => 'warning',
                'bubble' => false,
                'path' => storage_path('logs/warning.log'),
    ],
    

    现在,如果我使用Log::warning('warning'),它只会出现在warning.log

    【讨论】:

      【解决方案4】:

      选项 1:使用 bubble 参数

      假设您的系统仅生成 INFOERROR 级别的消息(或更准确地说,为每个日志级别生成了处理程序),将消息发送到正确的处理程序的最简单方法是设置处理程序堆栈以正确的顺序并在处理程序的构造函数中使用bubble 参数:

      $logger = new \Monolog\Logger('ChannelName');
      
      // Note that higher-level messages are higher in the stack (added last)
      $logger->pushHandler(new \Monolog\Handler\StreamHandler(
          LOG_DIR.'info.log',
          \Monolog\Logger::INFO
      ));
      $logger->pushHandler(new \Monolog\Handler\StreamHandler(
          LOG_DIR.'error.log',
          \Monolog\Logger::ERROR,
          false // Prevents messages from bubbling 'up' the handler stack
      ));
      
      $logger->info('Test info message.'); // Only sent to info.log
      $logger->error('Test error message.'); // Only sent to error.log
      

      请记住,堆栈被处理为“后进先出”,因此添加到堆栈的最后一项是第一个处理的项。因为日志级别是处理程序将处理的最低级别,所以处理程序应按从低到高的顺序添加到堆栈中。

      bubble 参数,默认为true,指示消息是否应该传播到堆栈中的其余处理程序(另一个答案中描述的日志级别)。通过在上面的代码中将其设置为false,在错误处理程序处理完消息后,堆栈的其余部分不会被调用。

      选项 2:使用 FilterHandler 包装器

      如果您对系统生成的每个日志级别都有处理程序,上述操作就可以了。但如果不是这样呢?例如,如果您希望错误日志捕获级别 ERROR 及更高级别的任何内容,但您还想要一个仅处理级别 ALERT 的处理程序,例如发送电子邮件通知,该怎么办?

      Monolog 的FilterHandler 是一个包装器,可让您指定处理程序将接收的日志级别。您可以指定从最小值到最大值的级别范围,或明确级别的列表。

      它的构造函数接受以下参数:

      Parameter Type Description Default
      $handler callable HandlerInterface Handler or factory callable($record|null, $filterHandler)
      $minLevelOrList int|array A list of levels to accept or a minimum level if maxLevel is provided Logger::DEBUG
      $maxLevel int|string Maximum level to accept, only used if $minLevelOrList is not an array Logger::EMERGENCY
      $bubble bool Whether the messages that are handled can bubble up the stack or not true

      要使用它,我们只需将它添加到处理程序堆栈的顶部:

      $logger = new \Monolog\Logger('ChannelName');
      
      // Note that higher-level messages are higher in the stack (added last)
      $logger->pushHandler(new \Monolog\Handler\StreamHandler(
          LOG_DIR.'info.log',
          \Monolog\Logger::INFO
      ));
      $logger->pushHandler(new \Monolog\Handler\StreamHandler(
          LOG_DIR.'error.log',
          \Monolog\Logger::ERROR,
          false // Prevents messages from bubbling up the handler stack
      ));
      // Use FilterHandler to only pass certain messages to a handler
      $logger->pushHandler(new \Monolog\Handler\FilterHandler(
          new \Monolog\Handler\StreamHandler(LOG_DIR.'alerts.log'), // Handler to receive filtered messages
          [\Monolog\Logger::ALERT] // Explicit list only contains ALERT
      ));
      
      
      $logger->info('Test info message.'); // Sent to info.log only
      $logger->error('Test error message.'); // Sent to error.log
      $logger->alert('Test alert message.'); // Sent to alerts.log and error.log
      $logger->emergency('Test emergency message.'); // Sent to error.log
      

      注意以下几点:

      • 未设置目标处理程序的日志级别,将其保留为默认的Logger::DEBUG,因为FilterHandler 将控制它接收的消息级别。
      • 冒泡保留在默认的true,以便调用堆栈的其余部分。
      • Logger::ALERT 作为数组传递,因此它将被视为显式项而不是最低级别,因此 EMERGENCY 消息不会发送到 alerts.log

      最后一件事:Monolog 附带 many other handlers,用于进行特殊处理,例如电子邮件。为简单起见,我只是使用StreamHandler 作为目标处理程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-03
        • 1970-01-01
        • 2012-04-17
        • 2018-12-20
        • 2016-01-09
        相关资源
        最近更新 更多