我有一个脚本,每天将在服务器上运行,以从没有HTML输出的资源下载数据。默认情况下,PHP会将我的脚本错误输出到php_error.log
和NetBeans的输出窗口中。
我创建了一个用户错误处理程序:
// user defined error handling function
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
{
error_log($errmsg, 3, "logs/aem.log");
switch ($errno) {
case E_ERROR:
exit("Error grave $errmsg at $filename:$linenum");
break;
case E_USER_ERROR:
exit("Error grave $errmsg at $filename:$linenum");
break;
}
}
error_reporting(0);
set_error_handler('userErrorHandler');
我将此文件包含在主脚本中,一切正常。
在开发应用程序时,我希望继续在Netbeans的“输出”屏幕上看到错误消息,并保留错误日志文件(就像默认处理程序一样)。我尝试更改
error_reporting
的值或尝试使用以下值添加其他error_log函数:error_reporting(E_ALL | E_STRICT);
error_reporting(-1);
error_log($errmsg, 0);`
但是除非从文件中删除
include('mycustomhandler');
,否则我永远不会在输出中得到错误。如何模拟标准错误处理程序的行为?
最佳答案
您应该尝试对 stderr
使用输出(我想netbeans会对其进行解析)。例如:
fprintf( STDERR, "Normal error message %s\n", "With nested info");
对于记录错误,您可以使用
error_log()
(也许也可以处理到netbeans的输出)或尝试从error_log
( php.ini
)解析 ini_get()
。但是我想PHP使用internaly
syslog()
。因此,您的错误处理程序应如下所示:// Logging
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars){
$logLevel = 0;
$label = '';
$exit = false;
switch( $errno){
case E_ERROR:
case E_USER_ERROR:
$label = 'Critical error';
$exit = true;
$logLevel = LOG_ERR;
break;
// ...
}
$message = "$label: on line ... file, error string...";
if( $logLevel){
syslog( $logLevel, $message);
}
if( !ini_get( 'display_error') && $exit){
die( 'Fatal error occured.');
}
if( $label){
echo $message; // You're responsible for how error is displayed
}
if( $exit){
die();
}
}
error_reporting( E_ALL);
如果我没有满足您的要求,请在评论中提问
关于php - PHP自定义错误处理程序日志输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9214595/