如何記錄PHP錯誤日誌

2020-08-14 18:00:47

記錄PHP錯誤日誌的方法:首先設定PHP的組態檔;然後將使用指定的檔案記錄錯誤報告日誌;最後錯誤資訊記錄到操作系統的日誌裡。

記錄PHP錯誤日誌的方法:

1、使用指定的檔案記錄錯誤報告日誌

如果使用自己指定的檔案記錄錯誤日誌,一定要確保將這個檔案存放在文件根目錄之外,以減少遭到攻擊的可能。

並且該檔案一定要讓PHP指令碼的執行使用者 (Web伺服器進程所有者)具有寫許可權。假設在Linux操作系統中,將/usr/local/目錄下的error.log檔案作爲錯誤日誌檔案,並設定 Web伺服器進程使用者具有寫的許可權。然後在PHP的組態檔中,將error_log指令的值設定爲這個錯誤日誌檔案的絕對路徑。

相關學習推薦:(視訊)

需要將php.ini中的設定指令做如下修改:

  • error_reporting = E_ALL ;將會向PHP報告發生的每個錯誤

  • display_errors = Off ;不顯示滿足上條 指令所定義規則的所有錯誤報告

  • log_errors = On ;決定日誌語句記錄的位置

  • log_errors_max_len = 1024 ;設定每個日誌項的最大長度

  • error_log = /usr/local/error.log ;指定產生的 錯誤報告寫入的日誌檔案位置

PHP 的組態檔按上面的方式設定完成以後,並重新啓動Web伺服器。這樣,在執行PHP的任何指令碼檔案時,所產生的所有錯誤報告都不會在瀏覽器中顯示,而會記 錄在自己指定的錯誤日誌/usr/local/error.log中。此外,不僅可以記錄滿足error_reporting所定義規則的所有錯誤,而且 還可以使用PHP中的error_log()函數,送出一個使用者自定義的錯誤資訊。

該函數的原型如下所示:

bool error_log ( string message [, int message_type [, string destination [, string extra_headers]] )

此 函數會送出錯誤資訊到Web伺服器的錯誤日誌檔案、某個TCP伺服器或到指定檔案中。該函數執行成功則返回TRUE,失敗則返回FALSE。第一個參數 message 是必選項,即爲要送出的錯誤資訊。如果僅使用這一個參數,會按組態檔php.ini中所設定的位置處發送訊息。第二個參數message_type爲整 數值:0表示送到操作系統的日誌中;1則使用PHP的Mail()函數,發送資訊到某E-mail處,第四個參數extra_headers亦會用到;2 則將錯誤資訊送到TCP 伺服器中,此時第三個參數destination表示目的地IP及Port;3則將資訊存到檔案destination中。

如果以登入Oracle數據庫出現問題的處理爲例,該函數的使用如下所示:

<?php 
if(!Ora_Logon($username, $password)){ 
error_log("Oracle數據庫不可用!", 0); //將錯誤訊息寫入到操作系統日誌中 
 } 
if(!($foo=allocate_new_foo()){ 
 error_log("出現大麻煩了!", 1, ". mydomain.com"); //發送到管理員郵箱中 
 } 
error_log("搞砸了!", 2, "localhost:5000"); //發送到本機對應5000埠的伺服器中 
error_log("搞砸了!", 3, "/usr/local/errors.log"); //發送到指定的檔案中 
?>

2、 錯誤資訊記錄到操作系統的日誌裡

錯誤報告也可以被記錄到操作系統日誌裡,但不同的操作系統之間的日誌管理有點區別。在Linux上錯誤語句將送往syslog,而在Windows上錯誤 將發送到事件日誌裡。如果你不熟悉syslog,起碼要知道它是基於UNIX的日誌工具,它提供了一個API來記錄與系統和應用程式執行有關的訊息。 Windows事件日誌實際上與UNIX的syslog相同,這些日誌通常可以通過事件檢視器來檢視。如果希望將錯誤報告寫到操作系統的日誌裡,可以在配 置檔案中將error_log指令的值設定爲syslog。

具體需要在php.ini中修改的設定指令如下所示:

  • error_reporting = E_ALL ;將會向PHP報告發生的每個錯誤

  • display_errors = Off ;不顯示 滿足上條指令所定義規則的所有錯誤報告

  • log_errors = On ;決定日誌語句記錄的位置

  • log_errors_max_len = 1024 ;設定每個日誌項的最大長度

  • error_log = syslog ;指定產生的錯誤報告寫入操作系統的日誌裡

除了一般的錯誤輸出之外,PHP還允許向系統syslog中發送定製的訊息。雖然通過前面介紹的error_log()函數,也可以向syslog中發送定製的訊息,但在PHP中爲這個特性提供了需要一起使用的4個專用函數。

分別介紹如下:

define_syslog_variables()

在使用openlog()、syslog及closelog()三個函數之前必須先呼叫該函數。因爲在呼叫該函數時,它會根據現在的系統環境爲下面 下麪三個函數初使用化一些必需的常數。

openlog()

開啓一個和當前系統中日誌器的連線,爲向系統插入日誌訊息做好準備。並將提供的第一個字串參數插入到每個日誌訊息中,該函數還需要指定兩個將在日誌上下文使用的參數,可以參考官方文件使用。

syslog()

該 函數向系統日誌中發送一個定製訊息。需要兩個必選參數,第一個參數通過指定一個常數定製訊息的優先順序。例如LOG_WARNING表示一般的警 告,LOG_EMERG表示嚴重地可以預示着系統崩潰的問題,一些其他的表示嚴重程度的常數可以參考官方文件使用。第二個參數則是向系統日誌中發送的定製 訊息,需要提供一個訊息字串,也可以是PHP引擎在執行時提供的錯誤字串。

closelog()

該函數在向系統日誌中發送完成定製訊息以後呼叫,關閉由openlog()函數開啓的日誌連線。

如果在組態檔中,已經開啓向syslog發送定製訊息的指令,就可以使用前面介紹的四個函數發送一個警告訊息到系統日誌中,並通過系統中的syslog解析工具,檢視和分析由PHP程式發送的定製訊息,如下所示:

define_syslog_variables(); 
openlog("PHP5", LOG_PID , LOG_USER); 
 syslog(LOG_WARNING, "警告報告向syslog中發送的演示, 警告時間:".date("Y/m/d H:i:s")); 
 closelog(); 
 ?>

相關學習推薦:

以上就是如何記錄PHP錯誤日誌的詳細內容,更多請關注php中文網其它相關文章!