最近在開發項目中,由於關閉了日誌在瀏覽器显示,線上出現問題后,無法根據日誌來進行精細化調試,後來查到可以直接開啟日誌,實時打印生產環境的日誌,方法如下:

修改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");  //發送到指定的文件中   
 ?>