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 相关文章推荐
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
Python实现单词拼写检查
Apr 25 Python
解析Python中的__getitem__专有方法
Jun 27 Python
Python 中pandas.read_excel详细介绍
Jun 23 Python
Python获取系统所有进程PID及进程名称的方法示例
May 24 Python
python 数字类型和字符串类型的相互转换实例
Jul 17 Python
Python import与from import使用及区别介绍
Sep 06 Python
在Pycharm中自动添加时间日期作者等信息的方法
Jan 16 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
Aug 08 Python
在服务器上安装python3.8.2环境的教程详解
Apr 26 Python
python获取本周、上周、本月、上月及本季的时间代码实例
Sep 08 Python
解析python中的jsonpath 提取器
Jan 18 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
Search Engine Friendly的URL设计
2006/10/09 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
javascript读取RSS数据
2007/01/20 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
javascript排序函数实现数字排序
2015/06/26 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
Python中max函数用法实例分析
2015/07/17 Python
Python实现统计文本文件字数的方法
2017/05/05 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
Python绘制动态水球图过程详解
2020/06/03 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
教育孩子心得体会
2014/01/01 职场文书
材料成型及控制工程专业求职信
2014/06/19 职场文书
药店促销活动策划方案
2014/08/24 职场文书
健康状况证明书
2014/11/26 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
大学生团日活动总结
2015/05/06 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
祝寿主持词
2015/07/02 职场文书
python-for x in range的用法(注意要点、细节)
2021/05/10 Python
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python