歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

企業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

時區名

%%

符號"%"本身

本文出自 “好好活著” 博客,請務必保留此出處http://wolfword.blog.51cto.com/4892126/1299831

Copyright © Linux教程網 All Rights Reserved