Linux下apache日志分析與狀態查看方法



假設apache日志格式為:
118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] “GET /Public/Css/index.css HTTP/1.1″ 304 – “http://www.a.cn/common/index.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.3)”
日志字段所代表的內容如下:
1.遠程主機IP:表明訪問網站的是誰
2.空白(E-mail):為了避免用戶的郵箱被垃圾郵件騷擾,第二項就用“-”取代了
3.空白(登錄名):用於記錄瀏覽者進行身份驗證時提供的名字。
4.請求時間:用方括號包圍,而且采用“公用日志格式”或者“標准英文格式”。 時間信息最后的“+0800”表示服務器所處時區位於UTC之后的8小時。
5.方法+資源+協議:服務器收到的是一個什么樣的請求。該項信息的典型格式是“METHOD RESOURCE PROTOCOL”,即“方法 資源 協議”。
METHOD: GET、POST、HEAD、……
RESOURCE: /、index.html、/default/index.php、……(請求的文件)
PROTOCOL: HTTP+版本號
6.狀態代碼:請求是否成功,或者遇到了什么樣的錯誤。大多數時候,這項值是200,它表示服務器已經成功地響應瀏覽器的請求,一切正常。
7.發送字節數:表示發送給客戶端的總字節數。它告訴我們傳輸是否被打斷(該數值是否和文件的大小相同)。把日志記錄中的這些值加起來就可以得知服務器在一天、一周或者一月內發送了多少數據。

問題1:在apachelog中找出訪問次數最多的10個IP

awk '{print $1}' apache_log |sort |uniq -c|sort -nr|head -n 10

awk 首先將每條日志中的IP抓出來,如日志格式被自定義過,可以 -F 定義分隔符和 print指定列;

sort進行初次排序,為的使相同的記錄排列到一起;

upiq -c 合並重復的行,並記錄重復次數。

head進行前十名篩選;

sort -nr按照數字進行倒敘排序。

cut:顯示所選來擇的相關段。(-f 1 指的是一列,-d 指出源分割符是冒號百,PS:冒號和d之間有空格)
/etc/passwd配置文件來存放用戶源名、home目錄、默認執行腳本程序等。cat /etc/passwd顯示文件內容,將輸出百結果通過管道傳遞度給cut命令。cut -f 1 -d :
-d : 是以:作為分隔符
-f 1顯示以:分割問每一行的第一段內容。可以答cut --help查看幫助。

整體翻譯過來就度是:輸出當前問機器上所有用戶名。
我參考的命令是:
顯示10條最常用的命令
sed -e "s/| //n/g" ~/.bash_history | cut -d ' ' -f 1 | sort | uniq -c | sort -nr | head

問題2:在apache日志中找出訪問次數最多的幾個分鍾。
awk '{print $4}' access_log |cut -c 14-18|sort|uniq -c|sort -nr|head

awk 用空格分出來的第四列是[09/Jan/2010:00:59:59;

cut -c 提取14到18個字符

剩下的內容和問題1類似。

問題3:在apache日志中找到訪問最多的頁面:
awk '{print $11}' apache_log |sed 's/^.*cn/(.*/)/"//1/g'|sort |uniq -c|sort -rn|head
類似問題1和2,唯一特殊是用sed的替換功能將”http://www.a.cn/common/index.php”替換成括號內的內容:”http://www.a.cn(/common/index.php)”
問題4:在apache日志中找出訪問次數最多(負載最重)的幾個時間段(以分鍾為單位),然后在看看這些時間哪幾個IP訪問的最多?
1,查看apache進程:
ps aux | grep httpd | grep -v grep | wc -l
2,查看80端口的tcp連接:
netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l
3,通過日志查看當天ip連接數,過濾重復:
cat access_log | grep "19/May/2011" | awk '{print $2}' | sort | uniq -c | sort -nr
4,當天ip連接數最高的ip都在干些什么(原來是蜘蛛):
cat access_log | grep "19/May/2011:00" | grep "61.135.166.230" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10

5,當天訪問頁面排前10的url:
cat access_log | grep "19/May/2010:00" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10
6,用tcpdump嗅探80端口的訪問看看誰最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr
接着從日志里查看該ip在干嘛:
cat access_log | grep 220.181.38.183| awk '{print $1"/t"$8}' | sort | uniq -c | sort -nr | less
7,查看某一時間段的ip連接數:
grep "2006:0[7-8]" www20110519.log | awk '{print $2}' | sort | uniq -c| sort -nr | wc -l
8,當前WEB服務器中聯接次數最多的20條ip地址:
netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -n -r | head -n 20
9,查看日志中訪問次數最多的前10個IP
cat access_log |cut -d ' ' -f 1 |sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 |less

10,查看日志中出現100次以上的IP
cat access_log |cut -d ' ' -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr |less
11,查看最近訪問量最高的文件
cat access_log |tail -10000|awk '{print $7}'|sort|uniq -c|sort -nr|less

12,查看日志中訪問超過100次的頁面
cat access_log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
13,列出傳輸時間超過 30 秒的文件
cat access_log|awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20
14,列出最最耗時的頁面(超過60秒的)的以及對應頁面發生次數
cat access_log |awk '($NF > 60 && $7~//.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100


















免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM