1. 程式人生 > >Apache伺服器access_log日誌詳解

Apache伺服器access_log日誌詳解



訪問日誌中會記錄伺服器所處理的所有請求,其檔名和位置取決於CustomLog指令,LogFormat指令可以簡化日誌的內容。
如何配置伺服器的訪問日誌?
通用日誌格式(Common Log Format)組合日誌格式(Combined Log Format)多檔案訪問日誌(條件日誌此處不作介紹)
Common Log Format:
LogFormat "%h %l %u %t "%r" %>s %b" common
CustomLog logs/access_log common
它定義了一種特定的記錄格式字串,並給它起了個別名叫 common,其中的"%"指示伺服器用某種資訊替換,其他字元則不作替換。引號(")必須加反斜槓轉義,以避免被解釋為字串的結束。格式字串還可以包含特殊的控制符,如換行符"n" 、製表符"t"。

CustomLog
指令建立一個使用指定別名的新日誌檔案,除非其檔名是以斜槓開頭的絕對路徑,否則其路徑就是相對於ServerRoot的相對路徑。

上述配置是一種被稱為通用日誌格式(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地址。如果HostnameLookups設為On,則伺服器會嘗試解析這個IP地址的主機名並替換此處的IP地址,但並不推薦這樣做,因為它會顯著拖慢伺服器,最好是用一個日誌後續處理器來判斷主機名,比如logresolve。如果客戶和伺服器之間存在代理,那麼記錄中的這個IP地址就是那個代理的IP地址,而不是客戶機的真實IP地址。
-(%l)
這是由客戶端identd程序判斷的RFC1413身份(identity),輸出中的符號"-"表示此處的資訊無效。除非在嚴格控制的內部網路中,此資訊通常很不可靠,不應該被使用。只有在將IdentityCheck指令設為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來改變時間的輸出形式,其中的format與C標準庫中的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開頭)。完整的狀態碼列表參見HTTP規範(RFC2616第10章)。
2326(%b)
最後這項是返回給客戶端的不包括響應頭的位元組數。如果沒有資訊返回,則此項應該是"-",如果希望記錄為"0"的形式,就應該用%B。
Combined Log Format:
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i"" combined
CustomLog 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 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"
其中,多出來的項是:
"http://www.example.com/start.html" ("%{Referer}i")
"Referer"請求頭。此項指明瞭該請求是被從哪個網頁提交過來的,這個網頁應該包含有/apache_pb.gif或者其連線。
"Mozilla/4.08 [en] (Win98; I ;Nav)" ("%{User-agent}i")
"User-Agent"請求頭。此項是客戶端提供的瀏覽器識別資訊。
多檔案訪問日誌
可以簡單地在配置檔案中用多個CustomLog指令來建立多檔案訪問日誌。如下例,既記錄基本的CLF資訊,又記錄提交網頁和瀏覽器的資訊,最後兩行CustomLog示範瞭如何模擬ReferLog和AgentLog指令的效果。
LogFormat "%h %l %u %t "%r" %>s %b" common
CustomLog logs/access_log common
CustomLog logs/referer_log "%{Referer}i -> %U"
CustomLog logs/agent_log "%{User-agent}i"
此例也說明了,記錄格式可以直接由CustomLog指定,而並不一定要用LogFormat起一個別名(相當於上面第一二行組合,即:CustomLog logs/access_log "%h %l %u %t "%r" %>s %b")。
這裡需要提到的是 關於多個虛擬機器之間的日記記錄管理:
如果伺服器配有若干虛擬主機,那麼還有幾個控制日誌檔案的功能。首先,可以把日誌指令放在<VirtualHost>段之外,讓它們與主伺服器使用同一個訪問日誌和錯誤日誌來記錄所有的請求和錯誤,但是這樣就不能方便的獲得每個虛擬主機的資訊了。
如果把CustomLog或ErrorLog指令放在<VirtualHost>段內,所有對這個虛擬主機的請求和錯誤資訊會被記錄在其私有的日誌檔案中,那些沒有在<VirtualHost>段內使用日誌指令的虛擬主機將仍然和主伺服器使用同一個日誌。這種方法對虛擬主機較少的伺服器很有用,但虛擬主機非常多時,就會帶來管理上的困難,還經常會產生檔案描述符短缺的問題。
對於訪問日誌,有一個很好的折衷方案,在同一個訪問日誌檔案中記錄對所有主機的訪問,而每條記錄都註明虛擬主機的資訊,日後再把記錄拆開存入不同的檔案。例如:
LogFormat "%v %l %u %t "%r" %>s %b" comonvhost
CustomLog logs/access_log comonvhost
%v用來附加虛擬主機的資訊。
有個split-logfile程式可以根據不同的虛擬主機資訊對日誌進行拆分,並將結果存入不同的檔案。