2011-08-22 100 views
6

我最近接管了遺留系統的開發,並希望能夠在部署環境中打開PHP E_NOTICE的日誌記錄。 INI有以下指令部署環境...記錄PHP通知錯誤

error_reporting = E_ALL & ~E_DEPRECATED 
display_errors = Off 
log_errors = On 

我以echo (E_ALL & ~E_DEPRECATED).' = '.error_reporting();,並且都匹配比較error_reporting位掩碼,所以我知道error_reporting水平不繫統本身內改變,如果我顯示display_errors = On通知,但未記錄。

那麼我該如何開始記錄PHP E_NOTICE的?

+0

除非我失去了一些東西,它應該已經記錄通知。你有沒有檢查它是否使用了一些自定義錯誤處理程序? –

+0

@ÁlvaroG. Vicario - 我的想法。沒有自定義錯誤處理程序,當我打開顯示錯誤(display_errors = On)時,顯示通知,但未記錄! – chattsm

+0

只要開始縮小問題範圍,您可能會忘記實際的代碼庫並嘗試[這個簡單的代碼片段](http://pastebin.com/6NCRcaUd)。 –

回答

1

原來的系統自定義的Apache ErrorLog指令定義,我一直tail -f ...默認的Apache的error_log 。

注意自我:總是先檢查網絡服務器設置,然後在SO上發佈愚蠢的問題!

0

您可以創建自己的處理程序

<?php 


function myErrorHandler($errno, $errstr, $errfile, $errline) 
{ 
    if ($errno == E_USER_NOTICE){ 
     /* log actions here */ 
    } 
} 

set_error_handler("myErrorHandler"); 
+0

我想避免添加自定義錯誤處理程序,這並不能解決displayiserrors = On時顯示通知但仍未記錄的問題。 – chattsm

2

更新:

根據這一答案的評論@mpc,正在顯示的錯誤在瀏覽器中,當display_errors是對的,但他們沒有出現在日誌中。我假設錯誤沒有出現。

是否E_NOTICE錯誤是唯一沒有出現在日誌中的錯誤,或者是所有錯誤類型都受到影響?如果它是所有錯誤類型,那麼我要檢查的第一件事是是否啓用錯誤日誌記錄。嘗試在腳本頂部設置ini_set('log_errors', 'On');。如果這不起作用,然後嘗試設置您的日誌文件,你肯定你的服務器可以通過調用ini_set('error_log', 'your_file_path');寫入。如果這些都不起作用,那麼我認爲你的PHP安裝有些問題。如果這些修補程序中的任何一個都能正常工作,則可以將它們放入實際的php.ini中,前提是有權訪問。


原來的答案:

基於對你的問題error_reporting水平,你的PHP安裝應該已經安裝報告E_NOTICE錯誤。如果它沒有記錄這些錯誤,則有些錯誤。我建議打開display_errors看是否有任何E_NOTICE錯誤顯示。如果您無法更改php.ini文件,請嘗試在腳本的頂部運行ini_set('display_errors', 'On');。顯然,這些錯誤只會顯示和/或記錄,如果你觸發一個,所以你應該仔細檢查你是否真的在某個地方做。

一個警告是E_DEPRECATED錯誤級別僅在PHP 5.3中引入。當我剛剛在PHP 5.2安裝中測試設置E_DEPRECATED時,PHP響應錯誤,並將error_reporting設置爲0,這意味着它報告完全沒有錯誤。雖然5.3以前版本的文件無法使用此設置,但我認爲至少應提高在不支持該設置的服務器上使用E_DEPRECATED的可能性。如果您不確定自己的版本,則可以運行phpinfo(),它將顯示包含許多信息(包括安裝的版本號)的頁面。儘管如此,如果我誤解了你的問題,而你只是在談論創建自己的自定義日誌記錄,那麼你需要創建一個函數來在發生錯誤時運行,並將它作爲錯誤處理程序使用set_error_handler()功能。

需要注意的是,當您使用set_error_handler()時,您完全繞過了PHP的默認錯誤處理程序。這意味着您的error_handler級別變得毫無意義。所有錯誤,無論其嚴重程度如何,都將傳遞給您創建的錯誤處理函數。 PHP傳遞給這個函數的第一個參數是錯誤號,它是找到的錯誤的常量的數值。您需要編寫自定義代碼才能捕獲所需的錯誤。

例如,爲了趕上E_NOTICE錯誤,你的函數應該是這樣的:

function my_error_handler($errno, $errstr, $errfile, $errline) { 
    if ($errno == E_NOTICE) { 
    // handle/log the error 
    } 
} 

set_error_handler("my_error_handler"); 
+0

一個完整的,結構良好的答案。但是,打開display_errors並不顯示通知,它們只是沒有記錄,而且服務器運行的是PHP 5.3.5,因此E_DEPRECATED問題不適用。我想避免編寫我自己的錯誤處理程序,我只是不知道爲什麼通知會顯示,但不會記錄! – chattsm

+0

@ m.p.c我沒有意識到這些錯誤顯示在瀏覽器中。這看起來像你的'error_reporting'級別是好的,它的日誌文件本身就有問題。我在答案的頂部做了更新。 – AgentConundrum