【问题标题】:PHP custom error handler log to outputPHP 自定义错误处理程序日志输出
【发布时间】:2012-03-02 03:27:22
【问题描述】:

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

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

【问题讨论】:

    标签: php error-handling error-reporting


    【解决方案1】:

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

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

    对于记录错误,您可以使用error_log()(也许也会处理输出到netbeans)或尝试从php.iniini_get())解析error_log

    但我猜 php 使用内部 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);
    

    如果我没有达到你的要求,请在 cmets 中提问

    【讨论】:

    • 处理程序中的好主意。我不会使用 syslog,因为使用我的自定义处理程序背后的主要思想是能够记录到特定于应用程序的文件。 fprintf() 也打印到 Netbeans 输出,因此我可以将其添加到处理程序中。
    • @DavidCasillas 所以 netbeans 解析来自 STDERR 的输出,这很好。这些只是想法,我希望至少有一些帮助:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2010-12-26
    相关资源
    最近更新 更多