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中apply函数的用法实例教程
Jul 31 Python
Python HTMLParser模块解析html获取url实例
Apr 08 Python
Python语言的面相对象编程方式初步学习
Mar 12 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
Python实现类似jQuery使用中的链式调用的示例
Jun 16 Python
Python 3中print函数的使用方法总结
Aug 08 Python
Python标准库inspect的具体使用方法
Dec 06 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
Feb 01 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
详解python tkinter教程-事件绑定
Mar 28 Python
Python 实现try重新执行
Dec 21 Python
基于PyTorch中view的用法说明
Mar 03 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中函数前加&符号的作用分解
2014/07/08 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
yii2使用gridView实现下拉列表筛选数据
2017/04/10 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
jquery $(this).attr $(this).val方法使用介绍
2013/10/08 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
requireJS模块化实现返回顶部功能的方法详解
2017/10/16 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
python获取mp3文件信息的方法
2015/06/15 Python
Python实现的使用telnet登陆聊天室实例
2015/06/17 Python
python使用super()出现错误解决办法
2017/08/14 Python
Python3中的json模块使用详解
2018/05/05 Python
python获取中文字符串长度的方法
2018/11/14 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
2020/02/28 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
PyTorch的torch.cat用法
2020/06/28 Python
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
思想汇报格式
2014/01/05 职场文书
推荐信模板
2014/05/09 职场文书
工地质量标语
2014/06/12 职场文书
2015年体育教学工作总结
2015/05/20 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
PHP遍历数组的6种方式总结
2021/11/17 PHP
Mysql超详细讲解死锁问题的理解
2022/04/01 MySQL