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

时间:2017-11-03 08:37:54

标签: php monolog

我在vanilla 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

3 个答案:

答案 0 :(得分:5)

我今天遇到了同样的问题,把我带到了这里。无论如何,我通过使用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");

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

$someVar = \Monolog\Logger::INFO;

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

答案 1 :(得分:0)

基于@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

答案 2 :(得分:-1)

将buubble param设置为false

$ logger-&gt; pushHandler(new StreamHandler( DIR 。&#39; /log/info.log' ;, Logger :: INFO,false));