有時候我們需要定制Apache預設日志的格式和内容,比如增加或減少日志所記錄的資訊、改變預設日志檔案的格式等。本文介紹可以用日志記錄的所有資訊,以及如何設定Apache使其記錄這些資訊。
一、Apache日志格式定義
很久以前,日志檔案隻有一種格式,這就是“公共格式”,許多人已經習慣于使用這種格式。随後出現了定制日志格式,而且看起來定制日志格式更很受歡迎,即使 公共日志格式本身也重新用定制日志格式定義。本文介紹的就是如何随心所欲地定制日志檔案的格式、如何讓日志檔案記錄自己想要的資訊。
定制日志檔案的格式涉及到兩個指令,即LogFormat指令和CustomLog指令,預設httpd.conf檔案提供了關于這兩個指令的幾個示例。
LogFormat指令定義格式并為格式指定一個名字,以後我們就可以直接引用這個名字。CustomLog指令設定日志檔案,并指明日志檔案所用的格式(通常通過格式的名字)。
LogFormat指令的功能是定義日志格式并為它指定一個名字。例如,在預設的httpd.conf檔案中,我們可以找到下面這行代碼:
LogFormat "%h %l %u %t \"%r\" %>s %b" common
該指令建立了一種名為“common”的日志格式,日志的格式在雙引号包圍的内容中指定。格式字元串中的每一個變量代表着一項特定的資訊,這些資訊按照格式串規定的次序寫入到日志檔案。
Apache文檔已經給出了所有可用于格式串的變量及其含義,下面是其譯文:
%...a: 遠端IP位址
%...A: 本地IP位址
%...B: 已發送的位元組數,不包含HTTP頭
%...b: CLF格式的已發送位元組數量,不包含HTTP頭。例如當沒有發送資料時,寫入‘-’而不是0。
%...{FOOBAR}e: 環境變量FOOBAR的内容
%...f: 檔案名字
%...h: 遠端主機
%...H 請求的協定
%...{Foobar}i: Foobar的内容,發送給伺服器的請求的标頭行。
%...l: 遠端登入名字(來自identd,如提供的話)
%...m 請求的方法
%...{Foobar}n: 來自另外一個子產品的注解“Foobar”的内容
%...{Foobar}o: Foobar的内容,應答的标頭行
%...p: 伺服器響應請求時使用的端口
%...P: 響應請求的子程序ID。
%...q 查詢字元串(如果存在查詢字元串,則包含“?”後面的部分;否則,它是一個空字元串。)
%...r: 請求的第一行
%...s: 狀态。對于進行内部重定向的請求,這是指*原來*請求 的狀态。如果用%...>s,則是指後來的請求。
%...t: 以公共日志時間格式表示的時間(或稱為标準英文格式)
%...{format}t: 以指定格式format表示的時間
%...T: 為響應請求而耗費的時間,以秒計
%...u: 遠端使用者(來自auth;如果傳回狀态(%s)是401則可能是僞造的)
%...U: 使用者所請求的URL路徑
%...v: 響應請求的伺服器的ServerName
%...V: 依照UseCanonicalName設定得到的伺服器名字
在所有上面列出的變量中,“...”表示一個可選的條件。如果沒有指定條件,則變量的值将以“-”取代。分析前面來自預設httpd.conf檔案的 LogFormat指令示例,可以看出它建立了一種名為“common”的日志格式,其中包括:遠端主機,遠端登入名字,遠端使用者,請求時間,請求的第一 行代碼,請求狀态,以及發送的位元組數。
有時候我們隻想在日志中記錄某些特定的、已定義的資訊,這時就要用到“...”。如果在“%”和變量之間放入了一個或者多個HTTP狀态代碼,則隻有當請 求傳回的狀态代碼屬于指定的狀态代碼之一時,變量所代表的内容才會被記錄。例如,如果我們想要記錄的是網站的所有無效連結,那麼可以使用:
LogFormat %404{Referer}i BrokenLinks
反之,如果我們想要記錄那些狀态代碼不等于指定值的請求,隻需加入一個“!”符号即可。
二、Apache日志格式說明
在通路日志中記錄了很多的客戶資訊,如果你有心,可以從這個日志中獲得很多有用的資訊!
正如其名字所示,通路日志access_log記錄了所有對Web伺服器的通路活動。下面是通路日志中一個典型的記錄:
這行内容由9項構成,上面的例子中有兩項空白,但整行内容仍舊分成了9項。
第一項資訊是遠端主機的位址。如果你想知道這個IP位址的域名,可通過nslookup或者host指令來檢視。如果你想讓Apache自己找出這個IP 的主機名,可以打開這個開關:HostnameLookups。(建議最好不要打開,會影響Apache記錄伺服器日志的速度)
第二項是空白,用一個"-"占位符替代。實際上絕大多數時候這一項都是如此。這個位置用于記錄浏覽者的辨別,這不隻是浏覽者的登入名字,而是浏覽者的 email位址或者其他唯一辨別符。這個資訊由identd傳回,或者直接由浏覽器傳回。很早的時候,那時Netscape 0.9還占據着統治地位,這個位置往往記錄着浏覽者的email位址。然而,由于有人用它來收集郵件位址和發送垃圾郵件,是以它未能保留多久,很久之前市 場上幾乎所有的浏覽器就取消了這項功能。是以,到了今天,我們在日志記錄的第二項看到email位址的機會已經微乎其微了。
第三項也是e800。這個位置用于記錄浏覽者進行身份驗證時提供的名字。當然,如果網站的某些内容要求使用者進行身份驗證,那麼這項資訊是不會空白的。但是,對于大多數網站來說,日志檔案的大多數記錄中這一項仍舊是空白的。
第四項是請求的時間。這個資訊用方括号包圍,而且采用所謂的"公共日志格式"或"标準英文格式"。是以,上例日志記錄表示請求的時間是2005年3月18日12:21:42。時間資訊最後的"+0800"表示伺服器所處時區位于UTC之後的8小時。
第五項資訊或許是整個日志記錄中最有用的資訊,它告訴我們伺服器收到的是一個什麼樣的請求。該項資訊的典型格式是"METHOD RESOURCE PROTOCOL",即"方法 資源 協定"。
RESOURCE是指浏覽者向伺服器請求的文檔,或URL。在這個例子中,浏覽者請求的是"/stats/awstats.pl?config=e800 "。
在上例中,METHOD是GET,其他經常可能出現的METHOD還有POST和HEAD。此外還有不少可能出現的合法METHOD,但主要就是這三種。
PROTOCOL通常是HTTP,後面再加上版本号。
第六項資訊是狀态代碼。它告訴我們請求是否成功,或者遇到了什麼樣的錯誤。大多數時候,這項值是200,它表示伺服器已經成功地響應浏覽器的 請求,一切正常。一般地說,以2開頭的狀态代碼表示成功,以3開頭的狀态代碼表示由于各種不同的原因使用者請求被重定向到了其他位置,以4開頭的狀态代碼表 示用戶端存在某種錯誤,以5開頭的狀态代碼表示伺服器遇到了某個錯誤。
第七項表示發送給用戶端的總位元組數。它告訴我們傳輸是否被打斷(即,該數值是否和檔案的大小相同)。把日志記錄中的這些值加起來就可以得知伺服器在一天、一周或者一月内發送了多少資料。
第九項表示用戶端的詳細資訊,這樣你就不難了解為什麼有些網站能夠在頁面中顯示你的IP、OS、Browser了。
引用
錯誤日志的設定
ErrorLog logs/error_log #日志的儲存位置
LogLevel warn #日志的級别
顯示的格式日下:
[Mon Oct 10 15:54:29 2005] [error] [client 192.168.10.22] access to /download/ failed, reason: user admin not allowed access
通路日志設定
日志的預設格式有如下幾種
LogFormat “%h %l %u %t “%r” %>s %b “%{Referer}i” “%{User-Agent}i”" combined
LogFormat “%h %l %u %t “%r” %>s %b” common #common為日志格式名稱
LogFormat “%{Referer}i -> %U” referer
LogFormat “%{User-agent}i” agent
CustomLog logs/access_log common
格式中的各個參數如下:
%h –用戶端的ip位址或主機名
%l –The 這是由用戶端 identd 判斷的RFC 1413身份,輸出中的符号 “-” 表示此處資訊無效。
%u –由HTTP認證系統得到的通路該網頁的客戶名。有認證時才有效,輸出中的符号 “-” 表示此處資訊無效。
%t –伺服器完成對請求的處理時的時間。
“%r” –引号中是客戶發出的包含了許多有用資訊的請求内容。
%>s –這個是伺服器傳回給用戶端的狀态碼。
%b –最後這項是傳回給用戶端的不包括響應頭的位元組數。
“%{Referer}i” –此項指明了該請求是從被哪個網頁送出過來的。
“%{User-Agent}i” –此項是客戶浏覽器提供的浏覽器識别資訊。
下面是一段通路日志的執行個體:
192.168.10.22 - bearzhang [10/Oct/2005:16:53:06 +0800] “GET /download/ HTTP/1.1″ 200 1228
192.168.10.22 - - [10/Oct/2005:16:53:06 +0800] “GET /icons/blank.gif HTTP/1.1″ 304 -
192.168.10.22 - - [10/Oct/2005:16:53:06 +0800] “GET /icons/back.gif HTTP/1.1″ 304 -