一、解析訪問日志
這兩個文件是 access_log(在Windows上是access.log)
error_log (在Windows上是error.log)
采用默認安裝方式時,這些文件可以在/usr/local/apache/logs下找到;對於Windows系統,這些日志文件將保存在Apache安裝目錄的logs子目錄。不同的包管理器會把日志文件放到各種不同的位置,所以你可能需要找找其他的地方,或者通過配置文件查看這些日志文件配置到了什么地方。
正如其名字所示,訪問日志access_log記錄了所有對Web服務器的訪問活動。下面是訪問日志中一個典型的記錄
分為7個部分:
(1)第一項信息是遠程主機的地址,即它表明訪問網站的究竟是誰。(可以要求apache查出所有的主機名字,並在日志文件中用主機名字來替代IP地址,但這種做法會極大的影響服務器記錄日志的速度,從而降低整個網站的效率,不值得推薦)。
然而,如果確實有必要讓apache找出遠程主機的名字,可以使用如下指令:
HostNameLookups on
如果HostNameLookups設置成double而不是on,日志記錄程序將對它找到的主機名字進行反向查找,驗證該主機名字確實指向了原來出現的IP地址。
(2)上例日志記錄的第二項是空白,用一個“-”占位符替代。實際上絕大多數時候這一項都是如此。這個位置用於記錄瀏覽者的標識,這不只是瀏覽者的登錄名字,而是瀏覽者的email地址或者其他唯一標識符。這個信息由identd返回,或者直接由瀏覽器返回。(為了避免用戶的郵箱被垃圾郵件騷擾,第二項就用“-”取代了)。
(3)日記記錄的第三項也是空白。這個位置用於記錄瀏覽者進行身份驗證時提供的名字。當然,如果網站的某些內容要求用戶進行身份驗證,那么這項信息室不會空白的。但是,對於大多數網站來說,日志文件的大多數記錄中這一項仍舊是空白的。
(4)日志記錄的第四項是請求的時間。這個信息用方括號包圍,而且采用“公用日志格式”或者“標准英文格式”。因此,時間信息最后的“-0400”表示服務器所處時區位於UTC之前的4小時。
(5)日志記錄的第五項信息或許是整個日志記錄中最有用的信息,它告訴我們服務器受到的是一個什么樣的請求。該項信息的典型格式是“METHOD RESOURCE PROTOCOL”即“方法 資源 協議”(我們通常進行日志監控的時候,主要也是看這項內容)。例子中METHOD是GET,還有POST、HEAD等其他類型,主要是這三種。
RESOURCE是指瀏覽者向服務器請求的文檔或者URL。在這個例子中,瀏覽者請求的是“/”,即網站的根或者主頁。大多數情況下,“/”指向DocumentRoot目錄的index.html文檔,但根據服務器配置的不同也可能指向其他文件。
PROTOCOL通常是HTTP,然后再加上版本號。
(6)日志的第六項信息室狀態代碼。它告訴我們請求是否成功,或者遇到了什么樣的錯誤。大多數時候這項是200,它表示服務器已經成功的響應瀏覽器的請求,一切正常。(以2開頭的狀態碼表示成功,以3開頭的狀態碼表示由於各種不同的原因用戶請求被重定向到了其他位置,以4開頭的狀態代碼表示客戶端存在某種錯誤,以5開頭的狀態代碼表示服務器遇到了某個錯誤)。
(7)日志記錄的第七項表示發送客戶端的總字節數。它告訴我們傳輸是否被打斷(即該數值是否和文件的大小相同)
1 2 3 4 5 6 7 8 9 (以空格分段)
1.以url進行分析
統計某url xxx/index ,一天的訪問次數
直接查找、統計
# cat access_log |grep xxx/index | wc -l
兩次精確查找、統計
# cat access_log |grep 'xxx/index' | grep '/images/index/e1.gif'|wc|awk '{print $1}'
統計日志中訪問超過100次的頁面
#cat access_log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
#cat access_log |awk '{print $7}'| sort | uniq -c | awk '{if($1>100) print $0}' | less
查看最近1萬條訪問中最高的頁面
#cat access_log |tail -10000|awk '{print $7}'|sort|uniq -c|sort -nr|less
?前五天的訪問次數最多的網頁
#cat access_log|awk '{print $7}'|uniq -c |sort -n -r|head -20
或者
awk '{print $11}' access_log | sed 's/^.*cn\(.*\)\"/\1/g' | sort | uniq -c | sort -rn | head
awk 首先將每條日志中的訪問頁面抓出來,如日志格式被自定義過,可以 -F 定義分隔符和 print指定列;
sed 's/^.*cn\(.*\)\"/\1/g' 將 .*cn\(.*\)\" 字符串用 \1 字符串替代,末端的g表示在行內進行全局替換,即某行 出現多個要替換字符,則全部替換;
用sed的替換功能將”http://www.a.cn/common/index.php”替換成括號內的內容 ”http://www.a.cn(/common/index.php)”
sed 's/^.*cn/(.*/)/"//1/g'
sort進行初次排序,為的使相同的記錄排列到一起;
upiq -c 合並重復的行,並記錄重復次數;
sort -nr按照數字進行倒敘排序;
?當前WEB服務器中連接次數最多的ip地址
#netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -nr
?查看日志中訪問次數最多的前10個IP
以空格分段取第一字段 去重復統計總數
#cat access_log |cut -d ' ' -f 1 |sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 |less
查看文件名 升序 按數字降序 打印整行 查看前十 分頁顯示
或者
awk '{print $1}' access_log | sort | uniq -c | sort -nr | head -n 10
awk 首先將每條日志中的IP抓出來,如日志格式被自定義過,可以 -F 定義分隔符和 print指定列;
sort進行初次排序,為的使相同的記錄排列到一起;
upiq -c 合並重復的行,並記錄重復次數。
sort -nr按照數字進行倒敘排序。
head進行前十名篩選;
?查看日志中出現100次以上的IP
# cat access_log |cut -d ' ' -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}' | sort -nr |less
第一字段大於100 則輸出整行
?從日志里查看該ip在干嘛
#cat access_log | grep 218.66.36.119| awk '{print $1"\t"$7}' | sort | uniq -c | sort -nr | less
?列出傳輸時間超過 30 秒的文件
#cat access_log|awk '($NF > 30){print $7}' |sort -n|uniq -c|sort -nr|head -20
NF表示最后一個域,當其大於30時 輸出第七字段 (需要修改access 日志記錄格式 增加 時間字段)
?列出最最耗時的頁面(超過60秒的)
#cat access_log |awk '($NF > 60 && $7~/\.php/){print $7}' |sort -n|uniq -c|sort -nr|head -100
awk '{print $4}' access_log | cut -c 14-18 | sort|uniq -c | sort -nr | head
awk 首先將每條日志中的 訪問頁面 抓出來 [29/Sep/2014:10:45:43
cut -c 14-18 再次將字符串中 14-18值抓出 10:45
222.163.80.18 - - [06/Jun/2016:00:01:27 +0800] "GET http://www.iyunshu.com/ HTTP/1.1" 200 62341 "-" "Mozilla/5.0 (Macintosh; Intel Mac
ip 時間 方法 URL 協議 狀態 大小 來源 客戶端信息
OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36 JianKongBao Monitor 1.1" "NONE" "NONE"

?查看哪些ip訪問的多
zcat
apache中日志記錄格式主要有兩種,普通型和復合型,安裝時默認使用common類型日志記錄訪問信息,
- LogFormat指令 定義格式並為格式指定一個名字,以后我們就可以直接引用這個名字。
- CustomLog指令 設置日志文件,並指明日志文件所用的格式(通常通過格式的名字)。
LogFormat "%h %l %u %t "%r" %>s %b" common 定義格式 和 名字
CustomLog "logs/access.log" common 使用此格式 存放位置(普通文件記錄)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 定義格式 和 名字
CustomLog logs/access_log combined 使用此格式 存放位置(復合日志記錄)
指定了日志的目錄路徑./logs/,指定了日志的格式,默認common。
common格式是通過:LogFormat "%h %l %u %t \"%r\" %>s %b" 定義的。
%h %l %u %t \"%r\" %>s %b
遠端主機 遠端登錄名 遠程用戶名 時間 請求第一行 狀態 傳送字節
combined格式通過:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""定義的
%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"
遠端主機 遠端登錄名 遠程用戶名 時間 請求第一行 狀態 傳送字節 請求來源
客戶端瀏覽器提供的瀏覽器識別信息
這里看兩個實例
common型記錄:
10.0.7.99 - - [31/May/2016:11:34:12 +0800] "GET / HTTP/1.1" 200 144
combined型記錄:
10.0.7.99 - - [31/May/2016:14:33:30 +0800] "GET / HTTP/1.1" 200 144 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.6.2000 Chrome/30.0.1599.101 Safari/537.36"
123.160.94.29 - - [03/Jun/2016:22:05:39 +0800] "GET /114/static/images/search/baidu.gif HTTP/1.1" 200 10383
123.160.94.29 - - [03/Jun/2016:22:05:39 +0800] "GET /114/static/images/search/baidu.gif HTTP/1.1" 200 10383 "http://120.76.121.147/114/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.9.2.1000 Chrome/39.0.2146.0 Safari/537.36"
User-Agent是Http協議中的一部分,屬於頭域的組成部分,User Agent也簡稱UA。用較為普通的一點來說,是一種向訪問網站提供你所使用的 瀏覽器類型 、 操作系統 及版本、CPU 類型、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等信息的標識。 UA字符串 在每次瀏覽器 HTTP 請求時發送到服務器!
64位操作系統 排版引擎 瀏覽器類型
(Windows NT 6.1; WOW64):
Windows NT 6.1 對應操作系統windows 7 Windows NT 6.0 對應操作系統 windows vista Windows NT 5.2 對應操作系統 windows 2003 Windows NT 5.1 對應操作系統 windows xp Windows NT 5.0 對應操作系統 windows 2000
雙引號里面的格式字符串代表特定的信息。
apache格式字符串及其含義:
有時候我們只想在日志中記錄某些特定的、已定義的信息,這時就要用到“…”。如果在“%”和變量之間放入了一個或者多個HTTP狀態代碼,則只有當請 求返回的狀態代碼屬於指定的狀態代碼之一時,變量所代表的內容才會被記錄。例如,如果我們想要記錄的是網站的所有無效鏈接,那么可以使用:
反之,如果我們想要記錄那些狀態代碼不等於指定值的請求,只需加入一個“!”符號即可:
LogFormat %!200U SomethingWrong
符號解析:
%% 百分號(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指令設定的服務器名稱。
</span><span style="font-size:18px;">
CustomLog logs/referer_log referer 也可以使用分開 來源與代理 的格式來記錄
CustomLog logs/agent_log agent
可以簡單地在配置文件中用多個CustomLog指令來建立多文件訪問日志。如下例,既記錄基本的CLF信息,又記錄提交網頁和瀏覽器的信息,最后兩行CustomLog示范了如何模擬ReferLog和AgentLog指令的效果。
CustomLog logs/access_log common
CustomLog logs/referer_log "%{Referer}i -> %U"
CustomLog logs/agent_log "%{User-agent}i"
web服務器日志輪循比較好的方式有三種:
第一種方法是利用Linux系統自身的日志文件輪循機制:logrotate;
第二種方法是利用apache自帶的日志輪循程序rotatelogs;
第三種是使用在apache的FAQ中推薦發展已經比較成熟的一個日志輪循工具cronolog。
選項:
- -l 使用本地時間代替GMT時間作為時間基准。
注意:在一個改變GMT偏移量(比如夏令時)的環境中使用-l會導致不 可預料的結果。 - logfile 它加上基准名就是日志文件名。如果logfile中包含"%",則它會被視為用於strftime()的格式字符串;否則 它會被自動加上以秒為單位的".nnnnnnnnnn"后綴。這兩種格式都表示新的日志開始使用的時間。
- rotationtime 日志文件滾動的以秒為單位的間隔時間。
- offset 相對於UTC的時差的分鍾數。如果省略,則假定為"0"並使用UTC時間。
比如,要指定UTC時差為"-5小時"的地區的當地時間,則此參數應為"-300"。
中國的時差要比美國多8個小時也就是480分鍾,所以要加上480分鍾
- filesizeM 指定以filesize M文件大小滾動,而不是按照時間或時差滾動。
舉例:
日志文件名稱
CustomLog "|/usr/bin/rotatelogs /logs/access_www_%Y%m%d%H%M.log 86400" combined
86400 ---日志滾動的時間是一天
400 ---日志文件最大400M就滾動
combined ---采用復合格式
#! /bin/bash
logdir=/var/log/httpd
cd ${logdir}
declare -i filesum=`ls access_log.* | wc -l`
declare -i delnum=$filesum-3
if [ "${delnum}" -ge 1 ];then
rm -rf `ls -tr access_log.* | head -${delnum}`
fi
chmod 755 clean_log
這樣就保留了最近3天的日志文件。
建立自動化任務
01 04 * * * /usr/local/crontab/clean_log
ok,搞定,就這么簡單。這樣你就不用不必為日見增大的日志文件煩惱了!