前言
本文的腳本是分析nginx的訪問日志, 主要為了檢查站點uri的訪問次數(shù)的,檢查的結果會提供給研發(fā)人員做參考,因為談到分析嘛,那肯定要用到正則表達式了,所以請沒有接觸過正則的小伙伴自行補腦,因為涉及正則的內容,實在沒法展開寫,正則的內容太過龐大,根本不是一篇兩篇能寫清楚的。
開始前,我們先看看要分析的日志結構:
1
2
|
127.0 . 0.1 - - [ 19 / Jun / 2012 : 09 : 16 : 22 + 0100 ] "GET /GO.jpg HTTP/1.1" 499 0 "http://domain.com/htm_data/7/1206/758536.html" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; SE 2.X MetaSr 1.0)" 127.0 . 0.1 - - [ 19 / Jun / 2012 : 09 : 16 : 25 + 0100 ] "GET /Zyb.gif HTTP/1.1" 499 0 "http://domain.com/htm_data/7/1206/758536.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; QQDownload 711; SV1; .NET4.0C; .NET4.0E; 360SE)" |
這是修改過的日志內容,敏感內容都以刪除或替換了,不過不影響我們的分析結果,當然格式什么的這都不重要,Nginx訪問日志是可以自定義的,每家公司可能都會稍有不同,所以要能理解腳本內容,并通過自己修改應用到了自己工作中才是重點,我給的日志格式也就是個參考,我打賭你在你公司服務器上看到的日志格式肯定跟我的格式不一樣, 看完日志格式,我們開始要寫我們的腳本了
我先貼代碼,稍后解釋:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
import re from operator import itemgetter def parser_logfile(logfile): pattern = (r'' '(\d+.\d+.\d+.\d+)\s-\s-\s' #IP address '\[(.+)\]\s' #datetime '"GET\s(.+)\s\w+/.+"\s' #requested file '(\d+)\s' #status '(\d+)\s' #bandwidth '"(.+)"\s' #referrer '"(.+)"' #user agent ) fi = open (logfile, 'r' ) url_list = [] for line in fi: url_list.append(re.findall(pattern, line)) fi.close() return url_list def parser_urllist(url_list): urls = [] for url in url_list: for r in url: urls.append(r[ 5 ]) return urls def get_urldict(urls): d = {} for url in urls: d[url] = d.get(url, 0 ) + 1 return d def url_count(logfile): url_list = parser_logfile(logfile) urls = parser_urllist(url_list) totals = get_urldict(urls) return totals if __name__ = = '__main__' : urls_with_counts = url_count( 'example.log' ) sorted_by_count = sorted (urls_with_counts.items(), key = itemgetter( 1 ), reverse = True ) print (sorted_by_count) |
腳本解釋,parser_logfile()
函數(shù)功能是分析日志,返回匹配的行列表,正則部分就不解釋了,大家看注釋應該知道它是匹配什么內容的,parser_urllist()
函數(shù)功能是將獲取用戶訪問的url,get_urldict()
函數(shù)功能是返回一個字典,以url為鍵,如果鍵相同值增1,返回的字典是每個url和最大的訪問次數(shù),url_count()
函數(shù)功能就是調用了之前定義的函數(shù),主函數(shù)部分,就說說itemgetter,它可以實現(xiàn)按指定元素進行排序,舉例就明白了:
1
2
3
4
5
6
7
8
|
>>> from operator import itemgetter >>> a = [( 'b' , 2 ),( 'a' , 1 ),( 'c' , 0 )] >>> s = sorted (a,key = itemgetter( 1 )) >>> s [( 'c' , 0 ), ( 'a' , 1 ), ( 'b' , 2 )] >>> s = sorted (a,key = itemgetter( 0 )) >>> s [( 'a' , 1 ), ( 'b' , 2 ), ( 'c' , 0 )] |
reverse=True參數(shù)表示降序排序,就是從大到小排序,腳本運行結果:
1
|
[( 'http://domain.com/htm_data/7/1206/758536.html' , 141 ), ( 'http://domain.com/?q=node&page=12' , 3 ), ( 'http://website.net/htm_data/7/1206/758536.html' , 1 )] |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。