我使用Syslog-NG在监控服务器上收集了一些日志:
不幸的是,没有引起任何错误,因为它们被评估为PHP通知(see this post)。
因此,我想知道使用Syslog-NG处理PHP错误的正确方法是什么,以便它们实际上被识别为错误。
答案 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编写,因此您无需编译任何内容。
我希望这会有所帮助。