前言
本文的脚本是分析nginx的访问日志, 主要为了检查站点uri的访问次数的,检查的结果会提供给研发人员做参考,因为谈到分析嘛,那肯定要用到正则表达式了,所以请没有接触过正则的小伙伴自行补脑,因为涉及正则的内容,实在没法展开写,正则的内容太过庞大,根本不是一篇两篇能写清楚的。
开始前,我们先看看要分析的日志结构:
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()
函数功能是分析日志,返回匹配的行列表,正则部分就不解释了,大家看注释应该知道它是匹配什么内容的,parser_urllist()
函数功能是将获取用户访问的url,get_urldict()
函数功能是返回一个字典,以url为键,如果键相同值增1,返回的字典是每个url和最大的访问次数,url_count()
函数功能就是调用了之前定义的函数,主函数部分,就说说itemgetter,它可以实现按指定元素进行排序,举例就明白了:
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参数表示降序排序,就是从大到小排序,脚本运行结果:
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 )]
|
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。