python正则分析nginx的访问日志
前言
本文的脚本是分析nginx的访问日志,主要为了检查站点uri的访问次数的,检查的结果会提供给研发人员做参考,因为谈到分析嘛,那肯定要用到正则表达式了,所以请没有接触过正则的小伙伴自行补脑,因为涉及正则的内容,实在没法展开写,正则的内容太过庞大,根本不是一篇两篇能写清楚的。
开始前,我们先看看要分析的日志结构:
127.0.0.1--[19/Jun/2012:09:16:22+0100]"GET/GO.jpgHTTP/1.1"4990"http://domain.com/htm_data/7/1206/758536.html""Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;.NETCLR1.1.4322;.NETCLR2.0.50727;.NETCLR3.0.4506.2152;.NETCLR3.5.30729;SE2.XMetaSr1.0)" 127.0.0.1--[19/Jun/2012:09:16:25+0100]"GET/Zyb.gifHTTP/1.1"4990"http://domain.com/htm_data/7/1206/758536.html""Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;QQDownload711;SV1;.NET4.0C;.NET4.0E;360SE)"
这是修改过的日志内容,敏感内容都以删除或替换了,不过不影响我们的分析结果,当然格式什么的这都不重要,Nginx访问日志是可以自定义的,每家公司可能都会稍有不同,所以要能理解脚本内容,并通过自己修改应用到了自己工作中才是重点,我给的日志格式也就是个参考,我打赌你在你公司服务器上看到的日志格式肯定跟我的格式不一样,看完日志格式,我们开始要写我们的脚本了
我先贴代码,稍后解释:
importre fromoperatorimportitemgetter defparser_logfile(logfile): pattern=(r'' '(\d+.\d+.\d+.\d+)\s-\s-\s'#IPaddress '\[(.+)\]\s'#datetime '"GET\s(.+)\s\w+/.+"\s'#requestedfile '(\d+)\s'#status '(\d+)\s'#bandwidth '"(.+)"\s'#referrer '"(.+)"'#useragent ) 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,它可以实现按指定元素进行排序,举例就明白了:
>>>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)]
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。