記錄PHP錯誤日誌的方法:先設定PHP的設定檔;然後將使用指定的檔案記錄錯誤報告日誌;最後錯誤訊息記錄到作業系統的日誌。
記錄PHP錯誤日誌的方法:
1、使用指定的檔案記錄錯誤報告日誌
如果使用自己指定的檔案記錄錯誤日誌,請務必確保將這個檔案存放在文檔根目錄之外,以減少遭到攻擊的可能性。
且該檔案一定要讓PHP腳本的執行使用者 (Web伺服器進程擁有者)具有寫入權限。假設在Linux作業系統中,將/usr/local/目錄下的error.log文件作為錯誤日誌文件,並設定 Web伺服器進程使用者俱有寫入的權限。然後在PHP的設定檔中,將error_log指令的值設定為這個錯誤日誌檔的絕對路徑。
相關學習推薦:php程式設計(影片)
#需要將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中文網其他相關文章!