我使用 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 编写,所以你不需要编译任何东西。
我希望这有帮助。