在Monolog ErrorHandler中设置最小PHP错误报告

时间:2017-04-27 18:09:48

标签: php error-handling monolog

刚开始使用Monolog记录我的PHP项目中的错误,但我想将最小错误报告设置设置为NOTICE及以上。我正在使用的代码

use Monolog\ErrorHandler;    
$handler = new ErrorHandler($logger);

$handler->registerErrorHandler([], false);
$handler->registerExceptionHandler();
$handler->registerFatalHandler();

会产生包括NOTICES在内的所有错误。如何将等效设置为

  

error_reporting(E_ALL& ~E_NOTICE);

使用Monolog

2 个答案:

答案 0 :(得分:1)

ErrorHandler会抓住trigger_error的所有级别,除非您使用@运算符使其静音,或者实际设置error_reporting(E_ALL & ~E_NOTICE);

的error_reporting

如果由于某种原因你想要保持错误报告但同时过滤掉monolog错误处理程序捕获的那些错误,我会继续扩展错误处理程序并注册它。像这样:

class MyErrorHandler extends Monolog\ErrorHandler{

    public function handleError($code, $message, $file = '', $line = 0, $context = [])
    {
        if($code === E_NOTICE){
            return;
        }

        parent::handleError($code, $message, $file, $line, $context);
    }
}

use MyErrorHandler as ErrorHandler;    
$handler = new ErrorHandler($logger);

$handler->registerErrorHandler([], false);
$handler->registerExceptionHandler();
$handler->registerFatalHandler();

请注意,我实际上没有对此进行过测试,但我发现没有理由不起作用

答案 1 :(得分:0)

Monolog日志记录级别与PHP日志记录级别无关。由error_reporting()设置的PHP日志记录级别控制PHP引擎本身在其自己的输出中报告的内容类型。 Monolog日志记录级别模拟unix syslog级别,旨在由应用程序驱动,而不是由PHP驱动。即,error_reporting()处理由PHP生成的消息,而Monolog处理由您的应用生成的消息。例如,在您的应用程序中,当您发出日志时,您需要指明其严重性:

if ($some_not_important_condition) {
    $logger->info('foo');
}
if ($some_important_condition) {
    $logger->error('bar');
}

因此,您的应用始终会创建info级别的日志条目,并且可以根据运行时配置来决定进入哪个和/或去哪里。例如,您可以在开发中打印到屏幕或在生产中登录Nagios。