PHP自定义错误处理程序日志输出

时间:2012-02-09 16:17:42

标签: php error-handling error-reporting

我有一个脚本,每天在服务器上运行,从没有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');,否则我从未在输出中收到错误。

如何模拟标准错误处理程序的行为?

1 个答案:

答案 0 :(得分:1)

您应该尝试使用输出stderr(我猜netbeans会解析它)。例如:

fprintf( STDERR, "Normal error message %s\n", "With nested info");

对于记录错误,您可以使用error_log()(也可能会处理netbeans的输出)或尝试从php.inierror_log)解析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);

如果我没有达到您的要求,请在评论中提问