您好,登錄后才能下訂單哦!
企業shell腳本分析apache日志實戰
一,分析apache日志
1,有一個文件shell.sh,內容如下:
[root@test3root]#catshell.sh
http://www.baidu.com/index.html
http://www.google.com/index.html
http://www.baidu.com/get.html
http://www.baidu.com/set.html
http://www.google.com/index.html
http://www.yahoo.com.cn/put.html
現要求將該文件中的域名截取出來,統計重復域名出現的次數,然后按次數進行降序排列,統計后的結果如下:
3www.baidu.com
2www.google.com
1www.yahoo.com.
sort將文件的每一行作為一個單位,相互比較,比較原則是從首字符向后,依次按ASCII碼值進行比較,最后將他們按升序輸出,uniq是去除緊挨著的相同的行只保留一行
[root@test3 ~]# awk -F "/"'{print $3}' shell.sh |sort |uniq -c 3 www.baidu.com 2 www.google.com 1 www.yahoo.com.cn
2,在apachelog中找出訪問次數最多的10個IP
/usr/local/apache2/logs/access_log
的格式如下
192.168.46.1-chen[21/Sep/2013:14:04:48+0800]"GET/phpmyadmin/themes/pmahomme/img/tab_hover_bg.pngHTTP/1.1"200502
[root@test3 ~]# awk '{print $1}' /usr/local/apache2/logs/access_log |sort|uniq -c|head -n 10 7 127.0.0.1 228 192.168.46.1
3.在apache日志中找出訪問次數最多的幾個分鐘
/usr/local/apache2/logs/access_log
的格式如下
192.168.46.1-chen[21/Sep/2013:14:04:48+0800]"GET/phpmyadmin/themes/pmahomme/img/tab_hover_bg.pngHTTP/1.1"200502
[root@test3 ~]# awk '{print $4}' /usr/local/apache2/logs/access_log|cut -c 14-18 |sort|uniq -c|sort -nr|head 33 13:55 30 13:35 19 13:22 15 13:54 15 13:45 15 13:38 15 13:36 13 13:04 10 12:59 9 13:18
4.在apache日志中找到訪問最多的頁面
/usr/local/apache2/logs/access_log
的格式如下
192.168.46.1-chen[21/Sep/2013:14:04:48+0800]"GET/phpmyadmin/themes/pmahomme/img/tab_hover_bg.pngHTTP/1.1"200502
[root@test3 ~]# awk '{print $7}' /usr/local/apache2/logs/access_log |sort|uniq -c|sort -nr|head 46 / 44 /phpmyadmin/ 10 /phpmyadmin/js/jquery/jquery-1.6.2.js?ts=1359376847 9 /phpmyadmin/js/update-location.js?ts=1359376847 9 /phpmyadmin/js/jquery/jquery-ui-1.8.16.custom.js?ts=1359376847 9 /phpmyadmin/js/jquery/jquery.qtip-1.0.0-rc3.js?ts=1359376847 9 /phpmyadmin/js/functions.js?ts=1359376847 8 /phpmyadmin/js/cross_framing_protection.js?ts=1359376847 7 /phpmyadmin/themes/pmahomme/jquery/jquery-ui-1.8.16.custom.css 7 /phpmyadmin/themes/pmahomme/img/sprites.png
5,在apache日志中找出訪問次數最多(負載最重)的幾個時間段(以分鐘為單位),然后在看看這些時間哪幾個IP訪問的最多?
/usr/local/apache2/logs/access_log
的格式如下
192.168.46.1-chen[21/Sep/2013:14:04:48+0800]"GET/phpmyadmin/themes/pmahomme/img/tab_hover_bg.pngHTTP/1.1"200502
如下是時間段的訪問量情況 [root@test3 ~]# awk '{print $4}' /usr/local/apache2/logs/access_log |cut -c 9-18 |uniq -c|sort -nr|head 33 2013:13:55 30 2013:13:35 19 2013:13:22 15 2013:13:54 15 2013:13:45 15 2013:13:38 15 2013:13:36 10 2013:12:59 9 2013:13:18 9 2013:13:16
6,apache相關的系統操作
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
二、日志切割
安裝cronolog
CentOS6.0中編譯安裝Apache默認日志是不切割的,需要用用工具Cronnolog進行日志切割
1.下載及安裝
wgethttp://cronolog.org/download/cronolog-1.6.2.tar.gz
tarzxvfcronolog-1.6.2.tar.gz
cdcronolog-1.6.2
./configure
make&&makeinstall
2.用which命令查看路徑驗證安裝
whichcronolog
默認路徑為:/usr/local/sbin/cronolog
3.配置
vi/usr/local/apache/conf/httpd.conf
CustomLog“|/usr/local/sbin/cronolog/usr/local/apache/logs/access_%Y%m%d.log”combined定義訪問日志
ErrorLog“|/usr/local/sbin/cronolog/home/www/ex/log/error_%Y%m%d.log”定義錯誤日志
保存配置文件后,重新加載或重啟apache服務即可生效。
servicehttpdrestart
還有另外一種使用rotatelogs方法:
Linux系統配置方法:
將其改為
ErrorLog"|/usr/local/apache/bin/rotatelogs/usr/local/apache/logs/%Y_%m_%d_error_log86400480"
CustomLog"|/usr/local/apache/bin/rotatelogs/usr/local/apache/logs/%Y_%m_%d_access_log86400480"common
Windows系統下配置方法:
#ErrorLog"|bin/rotatelogs.exelogs/error-%y%m%d.log86400480"
#CustomLog"|bin/rotatelogs.exelogs/access-%y%m%d.log86400480"common
、apache日志切割
輯Apache的主配置文件,更改內容如下:
注釋掉如下兩行
ErrorLoglogs/error_log
CustomLoglogs/access_logcommon
然后添加如下兩行
ErrorLog"|/usr/local/apache/bin/rotatelogs/usr/local/apache/logs/errorlog.%Y-%m-%d-%H_%M_%S2M+480"
CustomLog"|/usr/local/apache/bin/rotatelogs/usr/local/apache/logs/accesslog.%Y-%m-%d-%H_%M_%S2M+480"common
意義如下:
errorlog.%Y-%m-%d-%H_%M_%S為生成日志的格式,類似于這樣:errorlog.2010-04-15-11_32_30,以年月日時分秒為單位的,
2M為日志的大小,即為日志達到多大后生成新的日志文件,支持的單位為K,M,G,本處為2M
+480為時差,文件的時間為美國時間,中國的時差要比美國多8個小時也就是480分鐘,所以要加上480分鐘
還有其他的設置方法如下:
每天生成一個錯誤日志文件
ErrorLog"|bin/rotatelogs.exe-llogs/error-%Y-%m-%d.log86400"
其中86400為輪轉的時間單位為秒
參考:http://hi.baidu.com/jiaofu1127/blog/item/15fed5fa19895b47342acc4a.html
參考:http://man.chinaunix.net/newsoft/ApacheMenual_CN_2.2new/programs/rotatelogs.html
rotatelogs-滾動Apache日志的管道日志程序
rotatelogs是一個配合Apache管道日志功能使用的簡單程序。舉例:
CustomLog"|bin/rotatelogs/var/logs/logfile86400"common
此配置會建立文件"/var/logs/logfile.nnnn",其中的nnnn是名義上的日志啟動時的系統時間(此時間總是滾動時間的倍數,可以用于cron腳本的同步)。在滾動時間到達時(在此例中是24小時以后),會產生一個新的日志。
CustomLog"|bin/rotatelogs/var/logs/logfile5M"common
此配置會在日志文件大小增長到5兆字節時滾動該日志。
ErrorLog"|bin/rotatelogs/var/logs/errorlog.%Y-%m-%d-%H_%M_%S5M"
此配置會在錯誤日志大小增長到5兆字節時滾動該日志,日志文件名后綴會按照如下格式創建:errorlog.YYYY-mm-dd-HH_MM_SS。
語法
rotatelogs[-l]logfile[rotationtime[offset]]|[filesizeM]
選項
-l
使用本地時間代替GMT時間作為時間基準。注意:在一個改變GMT偏移量(比如夏令時)的環境中使用-l會導致不可預料的結果。
logfile
它加上基準名就是日志文件名。如果logfile中包含"%",則它會被視為用于strftime()的格式字符串;否則它會被自動加上以秒為單位的".nnnnnnnnnn"后綴。這兩種格式都表示新的日志開始使用的時間。
rotationtime
日志文件滾動的以秒為單位的間隔時間。
offset
相對于UTC的時差的分鐘數。如果省略,則假定為"0"并使用UTC時間。比如,要指定UTC時差為"-5小時"的地區的當地時間,則此參數應為"-300"。
filesizeM
指定以filesizeM文件大小滾動,而不是按照時間或時差滾動。
可移植性
下列日志文件格式字符串可以為所有的strftime()實現所支持,見各種擴展庫對應的strftime()的手冊。
%A
星期名全稱(本地的)
%a
3個字符的星期名(本地的)
%B
月份名的全稱(本地的)
%b
3個字符的月份名(本地的)
%c
日期和時間(本地的)
%d
2位數的一個月中的日期數
%H
2位數的小時數(24小時制)
%I
2位數的小時數(12小時制)
%j
3位數的一年中的日期數
%M
2位數的分鐘數
%m
2位數的月份數
%p
am/pm12小時制的上下午(本地的)
%S
2位數的秒數
%U
2位數的一年中的星期數(星期天為一周的第一天)
%W
2位數的一年中的星期數(星期一為一周的第一天)
%w
1位數的星期幾(星期天為一周的第一天)
%X
時間(本地的)
%x
日期(本地的)
%Y
4位數的年份
%y
2位數的年份
%Z
時區名
%%
符號"%"本身
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。