繁体   English   中英

Monolog - 仅记录特定级别的错误

[英]Monolog - logging only specific level of errors

我在香草 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 mesages到info.log

我今天也有同样的问题把我带到了这里。 无论如何,我使用Monologs FilterHandler解决了它。

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

还有一些其他处理程序可以在特定情况下使用。

// 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");

更新Ali请参阅\\ Monolog \\ Logger的源代码以查找可用的常量,然后将常量赋给变量。

$someVar = \Monolog\Logger::INFO;

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

基于@Sasha Vas的回答。

Monologs StreamHandler有一个bubble参数,可以完全按照你想要的方式运行,避免日志冒泡到其他级别。

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

这就是我的一个channels样子:

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

现在,如果我使用Log::warning('warning') ,它将只显示在warning.log

bubble param设置为false

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

选项 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

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

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

选项 2:使用FilterHandler包装器

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

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

它的构造函数采用以下参数:

范围 类型 描述 默认
$handler 可调用的 处理程序接口 处理程序或工厂可调用($record|null, $filterHandler)
$minLevelOrList 整数|数组 要接受的级别列表或最低级别(如果提供了 maxLevel) Logger::DEBUG
$maxLevel 整数|字符串 接受的最大级别,仅在 $minLevelOrList 不是数组时使用 Logger::EMERGENCY
$泡泡 布尔值 处理的消息是否可以冒泡堆栈 真的

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

$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 附带了许多其他处理程序,用于进行特殊处理,例如电子邮件。 为简单起见,我仅使用StreamHandler作为目标处理程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM