最近在開發項目中,由于關閉了日志在瀏覽器顯示,線上出現問題后,無法根據日志來進行精細化調試,后來查到可以直接開啟日志,實時打印生產環境的日志,方法如下:
修改php.ini
error_reporting = E_ALL ;將會向PHP報告發生的每個錯誤
display_errors = Off ;不顯示滿足上條 指令所定義規則的所有錯誤報告
log_errors = On ;決定日志語句記錄的位置
log_errors_max_len = 1024 ;設置每個日志項的最大長度
error_log = /usr/local/error.log ;指定產生的 錯誤報告寫入的日志文件位置
" role="presentation" style="position: relative;">
重新啟動Web服務器即可
這樣,在執行PHP的任何腳本文件時,所產生的所有錯誤報告都不會在瀏覽器中顯示,而會記錄在自己指定的錯誤日志/usr/local/error.log中。
注意事項
一定要確保將這個文件存放在文檔根目錄之外,以減少遭到攻擊的可能。
該文件一定要讓PHP腳本的執行用戶(Web服務器進程所有者)具有寫權限。
除了可以記錄滿足error_reporting所定義規則的所有錯誤,還可以使用PHP中的error_log()函數,送出一個用戶自定義的錯誤信息。
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"); //發送到指定的文件中
?>