有時候我們需要定制Apache默認日志的格式和內容,比如增加或減少日志所記錄的信息、改變默認日志文件的格式等。本文介紹可以用日志記錄的所有信息,以及如何設置Apache使其記錄這些信息。 一、定義日志格式(4月3日) 很久以前,日志文件只有一種格式,這就是“公共格式”,許多人已經習慣於使用這種格式。隨後出現了定制日志格式,而且看起來定制日志格式更很受歡迎,即使公共日志格式本身也重新用定制日志格式定義。本文介紹的就是如何隨心所欲地定制日志文件的格式、如何讓日志文件記錄自己想要的信息。 定制日志文件的格式涉及到兩個指令,即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 反之,如果我們想要記錄那些狀態代碼不等於指定值的請求,只需加入一個“!”符號即可: LogFormat %!200U SomethingWrong