0

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

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

不幸的是,由于它们被评估为 PHP 通知,因此没有引发错误(请参阅这篇文章)。

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

4

2 回答 2

0

这里有几件事/选项。那篇文章没有提到配置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做同样的事情也可能是一个好主意。

于 2013-05-07T04:22:38.173 回答
0

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

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

我希望这有帮助。

于 2013-05-10T20:46:57.423 回答