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

标签 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');,否则我永远不会在输出中得到错误。

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

最佳答案

您应该尝试对 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/

相关文章:

sql-server - SSIS 2005 OnError处理程序

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

php - ezSQL_mysql的声明::query() should be compatible with ezSQLcore::query()

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

php - 如何使用php在短信中发送验证码

php - 为什么我不能将此对象放入数组中?

PHP 没有在 session_start() 上创建 $_SESSION 变量;

php - MySQL 查询 CASE 或 JOIN 或 UNION - 使用哪个?

asp.net - 单击事件无法识别asp.net中的文本框

android - 来自 SDK 的崩溃分析