python正则分析nginx的访问日志


Posted in Python onJanuary 17, 2017

前言

本文的脚本是分析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)"

这是修改过的日志内容,敏感内容都以删除或替换了,不过不影响我们的分析结果,当然格式什么的这都不重要,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)

脚本解释,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)]

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
列举Python中吸引人的一些特性
Apr 09 Python
探究Python多进程编程下线程之间变量的共享问题
May 05 Python
Python实现截屏的函数
Jul 25 Python
在DigitalOcean的服务器上部署flaskblog应用
Dec 19 Python
Python3使用requests登录人人影视网站的方法
May 11 Python
Python实现曲线点抽稀算法的示例
Oct 12 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
May 07 Python
对pyqt5之menu和action的使用详解
Jun 20 Python
通过Python编写一个简单登录功能过程解析
Sep 04 Python
jenkins+python自动化测试持续集成教程
May 12 Python
keras-siamese用自己的数据集实现详解
Jun 10 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 Python
你应该知道的python列表去重方法
Jan 17 #Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 #Python
Python Socket传输文件示例
Jan 16 #Python
python批量添加zabbix Screens的两个脚本分享
Jan 16 #Python
python一键升级所有pip package的方法
Jan 16 #Python
centos6.7安装python2.7.11的具体方法
Jan 16 #Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 #Python
You might like
PHP获取网站域名和地址的代码
2008/08/17 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
php数组分页实现方法
2016/04/30 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
JQuery记住用户名和密码的具体实现
2014/04/04 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
概述jQuery的元素筛选
2016/11/23 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
python 自动提交和抓取网页
2009/07/13 Python
python的dict,set,list,tuple应用详解
2014/07/24 Python
Python科学计算之Pandas详解
2017/01/15 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
超市采购员岗位职责
2014/02/01 职场文书
西式婚礼主持词
2014/03/13 职场文书
民生工程实施方案
2014/03/22 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
捐书活动倡议书
2015/04/27 职场文书
纪律委员竞选稿
2015/11/19 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书
Elasticsearch 批量操作
2022/04/19 Python
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers