程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> Apache 日志文件格式及簡單處理 基礎教程

Apache 日志文件格式及簡單處理 基礎教程

編輯:PHP基礎知識
 

Apache對於所有經手的訪問日志,都會記錄在access_log中,對這個文件分析,可以了解很多服務器情況。例如訪問來源,訪問資源等

日志格式
根據Apache文檔,可以看到我們可以通過設置LogFormat來設置Apache記錄的日志格式。簡單的幾種設置格式如下:

1. Common Log Format (CLF)
"%h %l %u %t \"%r\" %>s %b"
2. Common Log Format with Virtual Host
"%v %h %l %u %t \"%r\" %>s %b"
3. NCSA extended/combined log format
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
4. Referer log format
"%{Referer}i -> %U"
5. Agent (Browser) log format
"%{User-agent}i"

這些格式都代表什麼意思呢?下面是一個參考表

%% 百分號(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模塊。

這麼多看著就頭疼,拿個例子來說明一下,比如

"%h %l %u %t \"%r\" %>s %b"

這是最常見的日志記錄格式,一般也是系統默認的,對應記錄下來的日志為:

61.135.219.2 - - [01/Jan/2014:00:02:02 +0800] "GET /feed/ HTTP/1.0" 200 12306

分解說明一下:

61.135.219.2 訪問來源IP
’-‘ 遠端登錄名(由identd而來,如果支持的話)
’-‘ 遠程用戶名
[01/Jan/2014:00:02:02 +0800] 請求時間,格式為[day/month/year:hour:minute:second zone]
“GET /feed/ HTTP/1.0” 請求內容,格式為”%m %U%q %H”,即”請求方法/訪問路徑/協議”
200 狀態碼
12306 返回數據大小
簡單處理
平常不太復雜的日志文件分析和處理直接可以用Shell腳本搞定,下面是幾個常用腳本

1.查看apache的進程數
ps -aux | grep httpd | wc -l

2.分析日志查看當天的ip連接數
cat default-access_log | grep "10/Dec/2010" | awk '{print $2}' | sort | uniq -c | sort -nr

3.查看指定的ip在當天究竟訪問了什麼url
cat default-access_log | grep "10/Dec/2010" | grep "218.19.140.242" | awk '{print $7}' | sort | uniq -c | sort -nr

4.查看當天訪問排行前10的url
cat default-access_log | grep "10/Dec/2010" | awk '{print $7}' | sort | uniq -c | sort -nr | head -n 10

5.看到指定的ip究竟干了什麼
cat default-access_log | grep 218.19.140.242 | awk '{print $1"\t"$8}' | sort | uniq -c | sort -nr | less

6.查看訪問次數最多的幾個分鐘(找到熱點)
awk '{print $4}' default-access_log |cut -c 14-18|sort|uniq -c|sort -nr|head

另外可以對日志進行簡單的處理,只保留自己需要的行和列,這個處理我用python寫了。例如SAE拿下來的日志

yansublog.sinaapp.com 61.135.219.2 930269 99 [01/Jan/2014:00:02:02 +0800] yansublog 636 1 "GET /feed/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (compatible;YoudaoFeedFetcher/1.0;http://www.youdao.com/help/reader/faq/topic006/;2 subscribers;)" 61.135.219.2.1388505722221452 yq22

挺多數據,但是其中有不知道干啥用的,為了分析方便,把不知道用處的刪掉

import re

f_input = open('access_log', 'r')
f_output = open('access_simple', 'w')

for line in f_input:
log = re.findall(r'.* (.*) .* .* (\[.*\]) .* .* .* (\".*\") (.*) (.*) (\".*\") (\".*\") .* .*', line)
log = list(log[0])
log[1:1] = '-'
log[1:1] = '-'
f_output.write(' '.join(log)+'\n')

f_input.close()
f_output.close()

如果想要對日志進一步分析,也可以安裝使用awstats

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved