apache日志LogFormat參數說明
在apache的配置文件httpd.conf裡默認有這麼一句配置
logformat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" common
這是APACHE的日志記錄格式設置,那麼這種格式裡的各個參數都代表什麼意思呢,下面看一下具體的參數說明:
請求本身的情況將通過在格式字符串中放置各種"%"轉義符的方法來記錄,它們在寫入日志文件時,根據下表的定義進行轉換:
%a 遠端IP地址
%A 本機IP地址
%B 除HTTP頭以外傳送的字節數
%b 以CLF格式顯示的除HTTP頭以外傳送的字節數,也就是當沒有字節傳送時顯示’-'而不是0。
%{Foobar}C 在請求中傳送給服務端的cookieFoobar的內容。
%D 服務器處理本請求所用時間,以微為單位。
%{FOOBAR}e 環境變量FOOBAR的值
%f 文件名
%h 遠端主機
%H 請求使用的協議
%{Foobar}i 發送到服務器的請求頭Foobar:的內容。
%l 遠端登錄名(由identd而來,如果支持的話),除非IdentityCheck設為"On",否則將得到一個"-"。
%m 請求的方法
%{Foobar}n 來自另一個模塊的注解Foobar的內容。
%{Foobar}o 應答頭Foobar:的內容。
%p 服務器服務於該請求的標准端口。
%P 為本請求提供服務的子進程的PID。
%{format}P 服務於該請求的PID或TID(線程ID),format的取值范圍為:pid和tid(2.0.46及以後版本)以及hextid(需要APR1.2.0及以上版本)
%q 查詢字符串(若存在則由一個"?"引導,否則返回空串)
%r 請求的第一行
%s 狀態。對於內部重定向的請求,這個狀態指的是原始請求的狀態,—%>s則指的是最後請求的狀態。
%t 時間,用普通日志時間格式(標准英語格式)
%{format}t 時間,用strftime(3)指定的格式表示的時間。(默認情況下按本地化格式)
%T 處理完請求所花時間,以秒為單位。
%u 遠程用戶名(根據驗證信息而來;如果返回status(%s)為401,可能是假的)
%U 請求的URL路徑,不包含查詢字符串。
%v 對該請求提供服務的標准ServerName。
%V 根據UseCanonicalName指令設定的服務器名稱。
%X 請求完成時的連接狀態:X= 連接在應答完成前中斷。
+= 應答傳送完後繼續保持連接。
-= 應答傳送完後關閉連接。
(在1.3以後的版本中,這個指令是%c,但這樣就和過去的SSL語法:%{var}c沖突了)
%I 接收的字節數,包括請求頭的數據,並且不能為零。要使用這個指令你必須啟用mod_logio模塊。
%O 發送的字節數,包括請求頭的數據,並且不能為零。要使用這個指令你必須啟用mod_logio模塊。
修飾符
可以緊跟在"%"後面加上一個逗號分隔的狀態碼列表來限制記錄的條目。例如,"%400,501{User-agent}i" 只記錄狀態碼400和501發生時的User-agent頭內容;不滿足條件時用"-"代替。狀態碼前還可以加上"!"前綴表示否 定,"%!200,304,302{Referer}i"記錄所有不同於200,304,302的狀態碼發生時的Referer頭內容。
"<"和">"修飾符可以用來指定對於已被內部重定向的請求是選擇原始的請求還是選擇最終的請求。默認情況下,%s, %U, %T, %D, %r 使用原始請求,而所有其他格式串則選擇最終請求。例如,%>s 可以用於記錄請求的最終狀態,而 %<u 則記錄一個已經被內部重定向到非認證資源的請求的原始認證用戶。
一些說明
出於安全考慮,從2.0.46版本開始,%r, %i, %o 中的特殊字符,除了雙引號(")和反斜線(\)分別用 \" 和 \\ 進行轉義、空白字符用C風格(\n, \t 等)進行轉義以外,非打印字符和其它特殊字符使用 \xhh 格式進行轉義(hh是該字符的16進制編碼)。在2.0.46以前的版本中,這些內容會被完整的按原樣記錄。這種做法將導致客戶端可以在日志中插入控制字 符,所以你在處理這些日志文件的時候要特別小心。
在2.0版本中(不同於1.3),%b 和 %B 格式字符串並不表示發送到客戶端的字節數,而只是簡單的表示HTTP應答字節數(在連接中斷或使用SSL時與前者有所不同)。mod_logio提供的 %O 格式字符串將會記錄發送的實際字節數。
示例
一些常見的格式串:
通用日志格式(CLF)
"%h %l %u %t \"%r\" %>s %b"
帶虛擬主機的通用日志格式
"%v %h %l %u %t \"%r\" %>s %b"
NCSA擴展/組合日志格式
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
Referer日志格式
"%{Referer}i -> %U"
Agent(Browser)日志格式
"%{User-agent}i"
文章開頭提到的LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" common 中間用" "包含的參數都可以在上面找到對應的說明,至於最後的那個common,其實就是這種格式的一種標識符,當你套用這種格式記錄日志的時候,就可以直接使用 標識符了,例如:
CustomLog logs/access_log common
就會在logs下面產生一個以common為格式記錄的日志文件access_log