使用Syslog-NG进行PHP错误记录

时间:2013-05-06 22:05:00

标签: php syslog-ng

我使用Syslog-NG在监控服务器上收集了一些日志:

  • 复制到本地日常轮播文件
  • 存储在MySQL数据库中。

不幸的是,没有引起任何错误,因为它们被评估为PHP通知(see this post)。

因此,我想知道使用Syslog-NG处理PHP错误的正确方法是什么,以便它们实际上被识别为错误。

2 个答案:

答案 0 :(得分:0)

这里有几件事/选择。那篇文章没有提到配置 php.ini 来使用syslog进行php内部的错误记录。你需要设置

error_log = syslog

我假设在文章中提到了

  

PHP有一个令人讨厌的习惯,即使用NOTICE错误记录所有内容   水平。

您可以通过这种方式打开错误日志记录到syslog,并按照该文章中建议的syslog voodoo进行操作,或者您可以 PHP方式,并且我的意思是使用更多的PHP来实现PHP错误与错误之间的映射系统日志错误级别。

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

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做同样的事情也可能是一个很好的主意。

答案 1 :(得分:0)

我通过我链接的博客上的推荐日志注意到这篇文章。 syslog的问题在于您无法保证邮件实际到达日志存储。当然,可以修补PHP以提供错误消息,但是如果您需要转发日志,那么直接将它们存储到数据库中会更好。

如果你坚持这样做,here's a library我帮助开发了它将取代PHP的本机syslog接口。它完全用PHP编写,因此您无需编译任何内容。

我希望这会有所帮助。

相关问题