繁体   English   中英

使用Syslog-NG记录PHP错误

[英]PHP error logging with Syslog-NG

我已经使用Syslog-NG在监视服务器上收集了一些日志,这些日志是:

  • 复制到本地每日轮换的文件中,
  • 存储到MySQL数据库中。

不幸的是,由于将它们视为PHP声明,因此不会引发任何错误( 请参阅本文 )。

因此,我想知道使用Syslog-NG处理PHP错误以使其真正被识别为错误的正确方法是什么。

这里有几件事/选项。 那篇文章没有提到将php.ini配置为使用syslog记录php内部的错误。 您需要设置

error_log = syslog

我假设这是在文章中提到的

PHP有一个烦人的习惯,即记录所有带有NOTICE错误级别的内容。

您可以以这种方式将错误日志记录打开到syslog,并按照该文章中建议的syslog voodoo进行操作,也可以以PHP方式进行操作 ,这就是说,我要使用更多的PHP来实现PHP错误和syslog错误级别之间的映射。

通过set_error_handler定义一个自定义错误处理程序,然后在处理程序中,将特定的PHP错误映射到某些特定的syslog错误级别,例如

function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if (!(error_reporting() & $errno)) {
        // This error code is not included in error_reporting
        return;
    }

    switch ($errno) {
    case E_USER_ERROR:
        $str = "<b>My ERROR</b> [$errno] $errstr<br />\n" .
               "  Fatal error on line $errline in file $errfile" .
               ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n" .
               "Aborting...<br />\n";
        syslog(LOG_CRIT, $errstr)
        exit(1);
        break;
    case E_USER_WARNING:
        // ...
}

使用set_exception_handler进行相同的操作也可能是一个好主意。

我通过链接的博客上的引荐日志注意到了该帖子。 syslog的问题是您不能保证您的消息将实际到达日志存储。 当然,可以对PHP进行补丁修复,以给您提供错误消息,但是如果您需要事务处理的日志,直接将它们存储到数据库中要好得多。

如果您坚持要这样做,这我帮助开发的一个库 ,它将取代PHP的本机syslog接口。 它完全用PHP编写,因此您不需要编译任何东西。

我希望这有帮助。

暂无
暂无

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

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