Apche日誌系列(2):錯誤日誌

原文連接:http://fanqiang.chinaunix.net/a6/b1/20010516/10080098.htmlhtml

錯誤日誌和訪問日誌同樣也是Apache的標準日誌。本文分析錯誤日誌的內容,介紹如何設置和錯誤日誌相關的選項,文檔錯誤和CGI錯誤的分類,以及如何方便地查看日誌內容,等等。

1、位置和內容

   前文討論了Apache的訪問日誌,包括它的內容、格式和如何設置訪問日誌有關的選項。本文咱們要討論的是另一種Apache標準日誌——錯誤日誌。 

   錯誤日誌不管在格式上仍是在內容上都和訪問日誌不一樣。然而,錯誤日誌和訪問日誌同樣也提供豐富的信息,咱們能夠利用這些信息分析服務器的運行狀況、哪裏出現了問題。 

   錯誤日誌的文件名字是error_log,但若是是Windows平臺,則錯誤日誌的文件名字是error.log。錯誤日誌的位置能夠經過ErrorLog指令設置: 



         ErrorLog logs/error.log

 
 


   除非文件位置用「/」開頭,不然這個文件位置是相對於ServerRoot目錄的相對路徑。若是Apache採用默認安裝方式安裝,那麼錯誤日誌的位置應該在/usr/local/apache/logs下。可是,若是Apache用某種包管理器安裝,錯誤日誌極可能在其餘位置。 

   正如其名字所示,錯誤日誌記錄了服務器運行期間遇到的各類錯誤,以及一些普通的診斷信息,好比服務器什麼時候啓動、什麼時候關閉等。 

   咱們能夠設置日誌文件記錄信息級別的高低,控制日誌文件記錄信息的數量和類型。這是經過LogLevel指令設置的,該指令默認設置的級別是error,即記錄稱得上錯誤的事件。有關該指令中容許設置的各類選項的完整清單,請參見http://www.apache.org/docs/mod/core.html#loglevel的Apache文檔。 

   大多數狀況下,咱們在日誌文件中見到的內容分屬兩類:文檔錯誤和CGI錯誤。可是,錯誤日誌中偶爾也會出現配置錯誤,另外還有前面提到的服務器啓動和關閉信息。 


2、文檔錯誤

   文檔錯誤和服務器應答中的400系列代碼相對應,最多見的就是404錯誤——Document Not Found(文檔沒有找到)。除了404錯誤之外,用戶身份驗證錯誤也是一種常見的錯誤。 

   404錯誤在用戶請求的資源(即URL)不存在時出現,它多是因爲用戶輸入的URL錯誤,或者因爲服務器上原來存在的文檔因故被刪除或移動。 

   順便說一下,按照Jakob Nielson的意見,在不提供重定向或者其餘補救措施的狀況下,咱們永遠不該該移動或者刪除Web網站的任何資源。Nielson的更多文章,請參見http://www.zdnet.com/devhead/alertbox/。 

   當用戶不能打開服務器上的文檔時,錯誤日誌中出現的記錄以下所示: 



    [Fri Aug 18 22:36:26 2000] [error]

       [client 192.168.1.6] File does not exist: 

       /usr/local/apache/bugletdocs/Img/south-korea.gif

 
 


   能夠看到,正如訪問日誌access_log文件同樣,錯誤日誌記錄也分紅多個項。 

   錯誤記錄的開頭是日期/時間標記,注意它們的格式和access_log中日期/時間的格式不一樣。access_log中的格式被稱爲「標準英文格式」,這或許是歷史跟咱們開的一個玩笑,但如今要改變它已經太遲了。 

   錯誤記錄的第二項是當前記錄的級別,它代表了問題的嚴重程度。這個級別信息多是LogLevel指令的文檔中所列出的任一級別(參見前面LogLevel的連接),error級別處於warn級別和crit級別之間。404屬於error錯誤級別,這個級別表示確實遇到了問題,但服務器還能夠運行。 

   錯誤記錄的第三項表示用戶發出請求時所用的IP地址。 

   記錄的最後一項纔是真正的錯誤信息。對於404錯誤,它還給出了完整路徑指示服務器試圖訪問的文件。當咱們料想某個文件應該在目標位置卻出現了404錯誤時,這個信息是很是有用的。此時產生這種錯誤的緣由每每是因爲服務器配置錯誤、文件實際所處的虛擬主機和咱們料想的不一樣,或者其餘一些意料不到的狀況。 

   因爲用戶身份驗證問題而出現的錯誤記錄以下所示: 



    [Tue Apr 11 22:13:21 2000] 

       [error] [client 192.168.1.3] user rbowen@rcbowen.

       com: authentication failure for "/cgi-bin/hirecareers/company.cgi":

       password mismatch

 
 


   注意,因爲文檔錯誤是用戶請求的直接結果,所以它們在訪問日誌中也會有相應的記錄。

3、CGI錯誤
   錯誤日誌最主要的用途或許是診斷行爲異常的CGI程序。爲了進一步分析和處理方便,CGI程序輸出到STDERR(Standard Error,標準錯誤設備)的全部內容都將直接進入錯誤日誌。這意味着,任何編寫良好的CGI程序,若是出現了問題,錯誤日誌就會告訴咱們有關問題的詳細信息。 

   然而,把CGI程序錯誤輸出到錯誤日誌也有它的缺點,錯誤日誌中將出現許多沒有標準格式的內容,這使得用錯誤日誌自動分析程序從中分析出有用的信息變得至關困難。 

   下面是一個例子,它是調試Perl CGI代碼時,錯誤日誌中出現的一個錯誤記錄: 



  [Wed Jun 14 16:16:37 2000] [error] [client 192.168.1.3] Premature 

  end of script headers: /usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi

  Global symbol "$rv" requires explicit package name at 

  /usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi line 81.

  Global symbol "%details" requires explicit package name at 

  /usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi line 84.

  Global symbol "$Config" requires explicit package name at 

  /usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi line 133.

  Execution of /usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi 

  aborted due to compilation errors.

 
 


   能夠看到,CGI錯誤和前面的404錯誤格式相同,包含日期/時間、錯誤級別以及客戶地址、錯誤信息。但這個CGI錯誤的錯誤信息有好幾行,這每每會干擾一些錯誤日誌分析軟件的工做。 

   有了這個錯誤信息,即便是對Perl不太熟悉的人也可以找出許多有關錯誤的信息,例如至少能夠方便地得知是哪幾行代碼出現了問題。Perl在報告程序錯誤方面的機制是至關完善的。固然,不一樣的編程語言輸出到錯誤日誌的信息會有所不一樣。 

   因爲CGI程序運行環境的特殊性,若是沒有錯誤日誌的幫助,大多數CGI程序的錯誤都將很難解決。 

   有很多人在郵件列表或者新聞組中抱怨說本身有一個CGI程序,當打開網頁時服務器卻返回錯誤,好比「Internal Server Error」。咱們能夠確定,這些人尚未看過服務器的錯誤日誌,或者根本不知道錯誤日誌的存在。決多大多數狀況下,錯誤日誌可以精確地指出CGI錯誤的所在以及如何修正這個錯誤。 

4、查看日誌文件

   我經常告訴別人說,在進行開發的同時我會不斷地檢查服務器的日誌,以便可以當即知道哪兒出了問題。但我獲得的回答卻每每是沉默。起先我覺得這種沉默意味着「你固然得這樣作」,後來我才發現這種沉默的真正含義是「我不知作別人的作法,但我本身是不幹的。」 

   雖然如此,下面咱們仍是要看看如何方便地查看服務器日誌文件。用telnet鏈接到服務器,而後輸入下面的命令: 



         tail -f /usr/local/apache/logs/error_log

 
 


   該命令將顯示出日誌文件的最後幾行內容,若是有新的內容加入到日誌文件,它還會當即顯示出新加入的內容。 

   Windows用戶也一樣可使用這種方法,好比可使用各類爲Windows提供的Unix工具軟件包。我我的愛好一個稱爲AINTX的工具,它能夠在http://maxx.mc.net/~jlh/nttools/index.htm找到。 

   還有一種替代方法是使用下面的Perl代碼,它利用了一個稱爲File::Tail的模塊: 



         use File::Tail;

         $file=File::Tail->new("/some/log/file");

         while (defined($line=$file->read)) {

                 print "$line";

         }

 
 


   不管具體採用的是哪種方法,同時打開多個終端窗口都是一種好習慣:好比在一個窗口中顯示錯誤日誌,在另外一個窗口中顯示訪問日誌。這樣,咱們就可以隨時獲知網站上發生的事情並當即予以解決。 

   在這個《Apache日誌》系列的下一篇文章中,咱們將討論定製服務器日誌,即如何在日誌文件中記錄全部咱們想要的信息,排除全部咱們不想要的信息。 

   在此以後,咱們還將討論日誌文件的處理,即如何從日誌文件生成統計報表。在最後幾篇文章中,咱們還將討論如何把日誌記錄重定向到指定的程序而不是保存到日誌文件,以便由程序實時地處理新生成的日誌數據,好比將日誌數據保存到數據庫,或者當發生某些關鍵性錯誤時經過email把日誌信息發送給系統管理員,等等。 

數據庫

相關文章
相關標籤/搜索