如何寫錯誤日志


對於PHP開發者來說,一旦某個產品投入使用,應該立即將display_error選項關閉,以免因為這些錯誤所透漏的路徑、數據庫連接、數據表等信息而遭到黑客攻擊。但是,任何一個產品在投入使用后,都難免會有錯誤出現,那么如何記錄一些對開發者有用的錯誤報告呢?我們可以在單獨的文本文件中將錯誤報告作為日志記錄。錯誤日志的記錄,可以幫助開發人員或者管理人員查看系統是否存在問題。

  如果需要將程序中的錯誤報告寫入錯誤日志中,只要在PHP的配置文件中,將配置指令log_errors開啟即可。錯誤報告默認就會記錄到Web服務器的日志文件里,例如記錄到Apache服務器的錯誤日志文件error.log中。當然也可以記錄錯誤日志到指定的文件中發送給syslog,分別介紹如下:
   ①使用指定的文件記錄錯誤報告日志
  如果使用自己指定的文件記錄錯誤日志,一定要確保將這個文件存放在文檔根目錄之外,以減少遭到攻擊的可能。並且該文件一定要讓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 ;設置每個日志項的最大長度
  error_log=/use/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中。如果以登入Oreacle數據庫出現問題的處理為例,該函數的使用如下所示:
1
2
3
4
5
6
7
8
9
10
11
<?php
if (!Ora_Logon( $username , $password )){ //打開一個 Oracle 連接
//將錯誤消息寫入到操作系統日志中
error_log ( "Oracle數據庫不可用!" ,0);
}
 
//發送到本機對應5000端口的服務器中
error_log ( "搞砸了!" ,2, "localhost:5000" );
//發送到指定文件夾中
error_log ( "搞砸了" ,3, "/usr/local/errors.log" );
?>
   ②錯誤信息記錄到操作系統的日志里
  錯誤報告也可以被記錄到操作系統日志里,但不同的操作系統之間的日志管理有點區別在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 ;設置每個日志項的最大長度
  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程序發送的定制消息,如下所示:
1
2
3
4
5
6
<?php
define_syslog_variables();
openlog( "php5" ,LOG_PID,LOG_USER);
syslog(LOG_WARNING, "警告報告向syslog中發送的演示,警告時間:" . date ( "Y/m/d H:i:s" ));
closelog ();
?>
  以Windows系統為例,通過右擊“我的電腦”選擇管理選項,然后到系統工具菜單中,選擇事件查看器,再找到應用程序選項,就可以看到我們自己定制的警告消息了。上面這段代碼將在系統syslog文件中,生成類似下面的一條信息,是事件的一部分:
  PHP5[3084],警告報告向syslog中發送弄個的演示,警告時間:2012/03/26 04:09:11.
  使用指定的文件還是使用syslog記錄錯誤日志,取決於你所在的Web服務器環境。如果你可以控制Web服務器,使用syslog是最理想的,因為你能利用syslog的解析工具來查看和分析日志。但如果你的網站在共享服務器的虛擬主機中運行,就只能使用單獨的文本文件記錄錯誤日志了。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM