2012-02-09 64 views
0

我有一個腳本,每天在服務器上運行,從沒有HTML輸出的資源下載數據。默認情況下,PHP會將我的腳本錯誤輸出到php_error.log以及NetBeans中的輸出窗口。PHP自定義錯誤處理程序日誌輸出

我創建了一個用戶錯誤處理程序:

// 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

你應該嘗試使用輸出到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); 

問意見的問題,如果我不打你是問在你的處理器

+0

不錯的想法。我不會使用syslog,因爲使用我的自定義處理程序的主要思想是能夠登錄到特定於該應用程序的文件。 'fprintf()'也打印到Netbeans輸出,所以我可以將它添加到處理程序。 – 2012-02-09 20:30:41

+0

@DavidCasillas讓netbeans解析STDERR的輸出,很好的確定。這些只是想法,我希望至少有一些幫助:)。 – Vyktor 2012-02-09 20:35:28