如何使用自定义错误处理程序捕获所有PHP错误?

时间:2014-10-23 作者:wasil

我想知道是否有任何方法可以在不修改核心的情况下捕获Wordpress中的所有PHP错误(不仅仅是WP错误)?

我这样问的原因是,我想手动捕获所有错误,并使用第三方软件作为错误聚合器,例如Sentry,但不限于例如,向他们发送电子邮件或登录到数据库。我知道Wordpress可以在调试模式下将错误记录到文件中,但这并不是我想要的,因为它很简单,而且有局限性。

是的,我想捕捉Wordpress核心错误,如果有。不仅与插件/主题相关。

[编辑]
这是我的客户提出的要求-他们希望我能够监视他们拥有的任何应用程序中所有与PHP相关的错误,而不仅仅是Wordpress。WP日志文件对他们来说是不够的,因为他们希望能够在一个地方聚合所有应用程序(包括WP)错误,为它们编制索引,生成支持票证等*

基本上如果我能把所有的错误都推过去Monolog, 那太好了。Monolog不是必需的,但很容易实现,仅此而已。

[编辑]
我已经试过了this gist,但仅限于DB操作。此外,我还尝试(出于教育原因)在主WP索引中添加错误处理程序(Monolog)。php文件,它可以工作,但我不知道如何让WP通过它推送所有的错误。我知道编辑核心文件是错误的(不是升级安全等),这就是为什么我问是否有其他方法*

提前感谢!

2 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

使用工具来监控自身始终是一个有问题的想法,如果wordpress有错误,您如何知道这些错误不会以阻止向上游报告的方式影响您的集成代码?

您最好的选择可能是在php中设置错误报告级别,如果适用,可以在wordpress中设置错误报告级别,并使用外部工具来监视文件并在文件更改时通知上游。

SO网友:David

是的,有一种方法可以通过使用set_error_handler():

$logger = new Monolog\\Logger( \'PHP-ERROR\' );
$logger->pushHandler(
    // Configure your Monolog handler here
);
set_error_handler( function( int $errNo, string $errStr, ... $args ) use ( $logger ) {
    $errorName = \'NOTICE\';
    $errorLevel = Monolog\\Logger::NOTICE;
    switch ( $errNo ) {
        case E_USER_WARNING : 
            $errorName = \'WARNING\';
            $errorLevel = Monolog\\Logger::WARNING;
            break;
        case E_USER_ERROR : 
            $errorName = \'ERROR\';
            $errorLevel = Monolog\\Logger::ERROR;
            break;
    }

    $errorMessage = "{$errorName} {$errStr}";
    $logger->addRecord( $errorLevel, $errorMessage );

    // return false if you want the default error handler to proceed
    return true;
) };
这只是一个未经测试的示例,但基本上是如何将PHP错误发送到Monolog的方法。因此,您可以使用所有现有Monolog处理程序的功能。

如果您想记录自定义WordPress错误(如DB错误、HTTP错误、登录失败),您必须侦听WP API的特定挂钩,并将有关这些事件的消息委托给Monolog。

但是,如果您能够使用第三方软件包,我建议您Wonolog. 旨在将WordPress连接到Monolog的库。它的功能与上述完全相同,并为插件开发人员添加了一个舒适的API,以记录他们喜欢的任何内容。

Edit: 如果只是关于PHP错误和独白,可以使用error handler 与Monolog一起提供:

$logger = new Monolog\\Logger( \'PHP-ERROR\' );
(new ErrorHandler( $logger ) )->registerErrorHandler()

结束

相关推荐

Displaying oEmbed errors?

有时,通过oEmbed嵌入项目是不可能的,例如,当YouTube视频已禁用嵌入时。The oEmbed service will return a 401 Unauthorized, 并且不会转换代码。有没有办法通知用户这一点?当前的工作流是非直观的(至少对我来说),我更喜欢在WordPress页面上,或者更好的是,在编辑器中显示一条消息,说明对象无法嵌入。