APACHE日誌檔案

gswwgph發表於2007-10-08
要有效地管理Web伺服器,就有必要反饋伺服器的活動、效能以及出現的問題。Apache HTTP伺服器提供了非常全面而靈活的日誌記錄功能。本文將闡述如何配置檔案以及如何理解日誌內容。
任何人只要對Apache存放日誌檔案的目錄具有寫許可權,也就當然地可以獲得啟動Apache的使用者(通常是root)的許可權,絕對不要隨意給予任何人存放日誌檔案目錄的寫許可權。細節請參見安全方面的提示
另外,日誌檔案可能會包含未加轉換的來自使用者的資訊,使用者就有機會惡意插入控制符,所以處理原始日誌時應該當心這個問題。
[@more@]
(Error Log)
相關模組
相關指令
·
·
錯誤日誌是最重要的日誌檔案,其檔名和位置取決於指令。Apache httpd將在這個檔案中存放診斷資訊和處理請求中出現的錯誤,由於這裡經常包含了出錯細節以及如何解決,如果伺服器啟動或執行中有問題,首先就應該檢視這個錯誤日誌。
錯誤日誌通常被寫入一個檔案(unix系統上一般是error_logWindowsOS/2上一般是error.log)。在unix系統中,錯誤日誌還可能被重定向到syslog
錯誤日誌的格式相對靈活,並可以附加文字描述。某些資訊會出現在絕大多數記錄中,一個典型的例子是:
[Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] client denied by server configuration: /export/home/live/ap/htdocs/test
其中,第一項是錯誤發生的日期和時間;第二項是錯誤的嚴重性,指令使只有高於指定嚴重性級別的錯誤才會被記錄;第三項是導致錯誤的IP地址;此後是資訊本身,在此例中,伺服器拒絕了這個客戶的訪問。伺服器在記錄被訪問檔案時,用的是檔案系統路徑,而不是Web路徑。
錯誤日誌中會包含類似上述例子的多種型別的資訊。此外,CGI指令碼中任何輸出到stderr的資訊會作為除錯資訊原封不動地記錄到錯誤日誌中。
使用者可以增加或刪除錯誤日誌的項。但是對某些特殊請求,在中也會有相應的記錄,比如上述例子在訪問日誌中也會有相應的記錄,其狀態碼是403,因為訪問日誌也可以定製,所以可以從訪問日誌中得到錯誤事件的更多資訊。
在測試中,對任何問題持續監視錯誤日誌是非常有用的。在unix系統中,可以這樣做:
tail -f error_log
(Access Log)
相關模組
相關指令
·
·
·
·
訪問日誌中會記錄伺服器所處理的所有請求,其檔名和位置取決於CustomLog指令,指令可以簡化日誌的內容。這裡闡述如何配置伺服器的訪問日誌。
實施日誌管理,首先當然必須產生訪問日誌,然後才能分析日誌從而得到有用的統計資訊。日誌分析不是Web伺服器的職責,已超出本文的範疇,更多資料和有關分析工具的資訊,可以檢視
不同版本的Apache httpd使用了不同的模組和指令來控制對訪問的記錄,包括mod_log_referer, mod_log_agentTransferLog指令。現在,CustomLog指令包含了舊版本中相關指令的所有功能。
訪問日誌的格式是高度靈活的,使用很象C風格的printf()函式的格式字串。下面有幾個例子,完整的說明可以檢視用於模組的
(Common Log Format)
這是一個典型的記錄格式:
LogFormat "%h %l %u %t "%r" %>s %b" commonCustomLog logs/access_log common
它定義了一種特定的記錄格式字串,並給它起了個別名common,其中的"%"指示伺服器用某種資訊替換,其他字元則不作替換。引號(")必須加反斜槓轉義,以避免被解釋為字串的結束。格式字串還可以包含特殊的控制符,如換行符"n" 、製表符"t"
CustomLog指令建立一個使用指定別名的新日誌檔案,除非其檔名是以斜槓開頭的絕對路徑,否則其路徑就是相對於的相對路徑。
上述配置是一種被稱為通用日誌格式(CLF)的記錄格式,它被許多不同的Web伺服器所採用,並被許多日誌分析程式所識別,它產生的記錄形如:
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
記錄的各部分說明如下:
127.0.0.1 (%h)
這是傳送請求到伺服器的客戶的IP地址。如果設為On,則伺服器會嘗試解析這個IP地址的主機名並替換此處的IP地址,但並不推薦這樣做,因為它會顯著拖慢伺服器,最好是用一個日誌後續處理器來判斷主機名,比如。如果客戶和伺服器之間存在代理,那麼記錄中的這個IP地址就是那個代理的IP地址,而不是客戶機的真實IP地址。
- (%l)
這是由客戶端identd程式判斷的RFC1413身份(identity),輸出中的符號"-"表示此處的資訊無效。除非在嚴格控制的內部網路中,此資訊通常很不可靠,不應該被使用。只有在將指令設為On時,Apache才會試圖得到這項資訊。
frank (%u)
這是HTTP認證系統得到的訪問該網頁的客戶標識(userid),環境變數REMOTE_USER會被設為該值並提供給CGI指令碼。如果狀態碼是401,表示客戶未透過認證,則此值沒有意義。如果網頁沒有設定密碼保護,則此項將是"-"
[10/Oct/2000:13:55:36 -0700] (%t)
這是伺服器完成請求處理時的時間,其格式是:
[//:::時區] = 2數字 = 3字母 = 4數字 = 2數字 = 2數字 = 2數字時區 = (+|-)4數字
可以在格式字串中使用%{format}t來改變時間的輸出形式,其中的formatC標準庫中的strftime()用法相同。
"GET /apache_pb.gif HTTP/1.0" ("%r")
引號中是客戶端發出的包含許多有用資訊的請求行。可以看出,該客戶的動作是GET,請求的資源是/apache_pb.gif,使用的協議是HTTP/1.0。另外,還可以記錄其他資訊,如:格式字串"%m %U%q %H"會記錄動作、路徑、查詢字串、協議,其輸出和"%r"一樣。
200 (%>s)
這是伺服器返回給客戶端的狀態碼。這個資訊非常有價值,因為它指示了請求的結果,或者是被成功響應了(2開頭),或者被重定向了(3開頭),或者出錯了(4開頭),或者產生了伺服器端錯誤(5開頭)。完整的狀態碼列表參見(RFC261610)
2326 (%b)
最後這項是返回給客戶端的不包括響應頭的位元組數。如果沒有資訊返回,則此項應該是"-",如果希望記錄為"0"的形式,就應該用%B
(Combined Log Format)
另一種常用的記錄格式是組合日誌格式,形式如下:
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i"" combinedCustomLog log/access_log combined
這種格式與通用日誌格式類似,但是多了兩個%{header}i項,其中的header可以是任何請求頭。這種格式的記錄形如:
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 " "Mozilla/4.08 [en] (Win98; I ;Nav)"
其中,多出來的項是:
" ("%{Referer}i")
"Referer"請求頭。此項指明瞭該請求是被從哪個網頁提交過來的,這個網頁應該包含有/apache_pb.gif或者其連線。
"Mozilla/4.08 [en] (Win98; I ;Nav)" ("%{User-agent}i")
"User-Agent"請求頭。此項是客戶端提供的瀏覽器識別資訊。
可以簡單地在配置檔案中用多個CustomLog指令來建立多檔案訪問日誌。如下例,既記錄基本的CLF資訊,又記錄提交網頁和瀏覽器的資訊,最後兩行CustomLog示範瞭如何模擬ReferLogAgentLog指令的效果。
LogFormat "%h %l %u %t "%r" %>s %b" commonCustomLog logs/access_log commonCustomLog logs/referer_log "%{Referer}i -> %U"CustomLog logs/agent_log "%{User-agent}i"
此例也說明了,記錄格式可以直接由CustomLog指定,而並不一定要用起一個別名。
許多時候,根據與請求特徵相關的來有選擇地記錄某些客戶端請求會帶來便利。首先,需要使用指令來設定特定的以識別符號合某種特定條件的請求,然後用CustomLog指令的env=子句,根據這些來決定記錄或排除特定的請求。例如:
# 不記錄本機發出的請求SetEnvIf Remote_Addr "127.0.0.1" dontlog# 不記錄對robots.txt檔案的請求SetEnvIf Request_URI "^/robots.txt$" dontlog# 記錄其他請求CustomLog logs/access_log common env=!dontlog
再如,將使用英語的請求記錄到一個日誌,而記錄非英語的請求到另一個日誌:
SetEnvIf Accept-Language "en" englishCustomLog logs/english_log common env=englishCustomLog logs/non_english_log common env=!english
雖然上述已經展示了條件日誌記錄的強大和靈活,但這不是控制日誌內容的唯一手段,還可以用日誌後繼處理程式來剔除你不關心的內容,從而使日誌更加有用。
即使一個並不繁忙的伺服器,其日誌檔案的資訊量也會很大,一般每10000個請求,訪問日誌就會增加1MB或更多。這就有必要定期滾動日誌檔案。由於Apache會保持日誌檔案的開啟,並持續寫入資訊,因此伺服器執行期間不能執行滾動操作。移動或者刪除日誌檔案以後,必須伺服器才能讓它開啟新的日誌檔案。
優雅的(graceful)方法重新啟動,可以使伺服器啟用新的日誌檔案,而不丟失原來尚未寫入的資訊。為此,有必要等待一段時間,讓伺服器完成正在處理的請求,並將記錄寫入到原來的日誌檔案。以下是一個典型的日誌滾動和為節省儲存空間而壓縮舊日誌的例子:
mv access_log access_log.oldmv error_log error_log.oldapachectl gracefulsleep 600gzip access_log.old error_log.old
另一種執行滾動的方法是使用下一節闡述的
Apache httpd可以透過管道將訪問記錄和出錯資訊傳遞給另一個程式,而不是寫入一個檔案,由於無須對主伺服器進行程式設計,這個功能顯著地增強了日誌的靈活性。只要用管道運算子"|"後面跟一個可執行檔名,就可以使這個程式從標準輸入裝置獲得事件記錄。Apache在啟動時,會同時啟動這個管道日誌程式,並且在執行過程中,如果這個程式崩潰了,會重新啟動這個程式(所以我們稱這個技術為"可靠管道日誌")
管道日誌程式由其父程式Apache httpd產生,並繼承其許可權,這意味著管道程式通常是作為root執行的,所以保持這個程式簡單而安全極為重要。
管道日誌的一種重要用途是,允許日誌滾動而無須重新啟動伺服器。為此,伺服器提供了一個簡單的程式。每24小時滾動一次日誌的例子如下:
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common
注意:引號用於界定整個管道命令列。雖然這是針對訪問日誌的,但是其用法對於其他日誌也一樣。
在其他站點,有一個類似但更靈活的日誌滾動程式叫
如果有較簡單的離線處理日誌的方案,就不應該使用條件日誌和管道日誌,即使它們非常強大。
如果伺服器配有若干,那麼還有幾個控制日誌檔案的功能。首先,可以把日誌指令放在段之外,讓它們與主伺服器使用同一個訪問日誌和錯誤日誌來記錄所有的請求和錯誤,但是這樣就不能方便的獲得每個虛擬主機的資訊了。
如果把CustomLog指令放在段內,所有對這個虛擬主機的請求和錯誤資訊會被記錄在其私有的日誌檔案中,那些沒有在段內使用日誌指令的虛擬主機將仍然和主伺服器使用同一個日誌。這種方法對虛擬主機較少的伺服器很有用,但虛擬主機非常多時,就會帶來管理上的困難,還經常會產生的問題。
對於訪問日誌,有一個很好的折衷方案,在同一個訪問日誌檔案中記錄對所有主機的訪問,而每條記錄都註明虛擬主機的資訊,日後再把記錄拆開存入不同的檔案。例如:
LogFormat "%v %l %u %t "%r" %>s %b" comonvhostCustomLog logs/access_log comonvhost
%v用來附加虛擬主機的資訊。有個程式可以根據不同的虛擬主機資訊對日誌進行拆分,並將結果存入不同的檔案。
相關模組
相關指令
·
·
·
·
·
·
·
·
·
·
·
·
記錄接收和傳送的實際位元組數
增加了兩個額外的欄位(%I %O)用於記錄接收和傳送的實際位元組數。
對比記錄(Forensic Logging)
提供了對客戶端請求的對比記錄,也就是在請求被處理之前和處理完成之後進行兩次記錄,所以對比日誌(forensic log)對於每個請求都包含兩條記錄。對比記錄器(forensic logger)十分嚴格,不可以進行定製。它可以成為無價的除錯和安全工具。
檔案
在啟動時,Apache httpd將會在logs/httpd.pid檔案中儲存其父程式httpd的程式ID(process id[PID])。該檔名可以用指令改變。該PID可以被管理員利用來重新啟動或者終止伺服器後臺守護程式。在Windows中,可以使用命令列引數 -k 。更多資訊請參見
為了方便除錯,可以用指令來記錄CGI指令碼的輸入和輸出。此功能應該僅用於測試,而不應該用於正常工作的伺服器。更多資料請參見文件。
在使用強大且靈活的時,幾乎都有必要用來幫助除錯。這個日誌提供了重寫引擎如何轉換請求的詳細分解資訊,其詳細程度取決於指令。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1701142/viewspace-975102/,如需轉載,請註明出處,否則將追究法律責任。

相關文章