python分析nginx日志_python分析nginx日志

上周咳嗽比较厉害,暂停了一周更新,收到很多小伙伴的留言关心,真是非常感动,非常感谢大家支持,我会尽我努力给大家分享干货, 现在吃了几天药,基本好的差不多了,这周接着聊python在运维中的实践,今天的脚本是分析nginx的访问日志, 主要为了检查站点uri的访问次数的,检查的结果会提供给研发人员做参考,因为谈到分析嘛,那肯定要用到正则表达式了,所以请没有接触过正则的小伙伴自行补脑,因为涉及正则的内容,实在没法展开写,正则的内容太过庞大,根本不是一篇两篇能写清楚的,开始前,我们先看看要分析的日志结构:

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)"

1

2

127.0.0.1--[19/Jun/2012:09:16:22+0100]"GET /GO.jpg HTTP/1.1"4990"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"4990"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访问日志是可以自定义的,每家公司可能都会稍有不同,所以要能理解脚本内容,并通过自己修改应用到了自己工作中才是重点,我给的日志格式也就是个参考,我打赌你在你公司服务器上看到的日志格式肯定跟我的格式不一样, 看完日志格式,我们开始要写我们的脚本了,我先贴代码,稍后解释:

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)

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

importre

fromoperatorimportitemgetter

defparser_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=[]

forlineinfi:

url_list.append(re.findall(pattern,line))

fi.close()

returnurl_list

defparser_urllist(url_list):

urls=[]

forurlinurl_list:

forrinurl:

urls.append(r[5])

returnurls

defget_urldict(urls):

d={}

forurlinurls:

d[url]=d.get(url,0)+1

returnd

defurl_count(logfile):

url_list=parser_logfile(logfile)

urls=parser_urllist(url_list)

totals=get_urldict(urls)

returntotals

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,它可以实现按指定元素进行排序,举例就明白了:

>>> 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)]

1

2

3

4

5

6

7

8

>>>fromoperatorimportitemgetter

>>>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参数表示降序排序,就是从大到小排序,脚本运行结果:

[('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)]

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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值