在Apache的httpd.conf文件中,通過LogFormat和CustomLog指令可以實現自定義日志文件格式和內容的目的。
前段時間從運營部了解到公司項目天氣預報15天查詢網(http://tqybw.net),有出現很多404頁,找到之后,做了修改,為了徹底解決這個問題,決定開啟日志跟蹤;
日志分析是網站開發應用一個非常重要的手段,可以幫助開發人員發現和解決很多問題!
LogFormat和CustomLog的格式化參數是一個字符串,這個字符串會在每次請求發生的時候,被記錄到日志文件中去。
它可以包含被原樣寫入日志的文本字符串以及控制字符如:“\t”、“\n”, 其他的特殊字符均可通過反斜杠轉義。請求本身的情況將通過在格式字符串中放置各種“%”轉義的方式來記錄。
下表列出了Apache日志格式字符串的含義
%% 百分號(Apache2.0.44或更高的版本)
%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模塊。
一些常見的格式串:
通用日志格式(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”
apache配置實例格式:
LogFormat "%h %l %u %t %T \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>