python正则分析nginx的访问日志
作者:mindg.cn 发布时间:2022-07-03 04:57:14
标签:python,nginx,日志
前言
本文的脚本是分析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)]
总结


猜你喜欢
- 1. 对于数组array乘就是对应位置的元素相乘:X1 = np.array([[1,2], [3, 4]])X2 = X1print X2
- iframe的防插与强插(一)中介绍了“市面上”能见到的两种防御被第三方网站iframe的方法,以及相应的变态突破方法。貌似把“受害人”逼上
- 我就废话不多说了,大家还是直接看代码吧~import timeimport mathimport numpy as npdef timeit
- 本文实例为大家分享了PyQt5实现简单计算器的具体代码,供大家参考,具体内容如下下面我们将介绍使用python的PyQt5图形界面来编写一个
- 用法分析 在查看SRGAN源码时有如下损失函数,其中设置了retain_graph=True,其作用是什么?################
- PHP simplexml_import_dom() 函数实例获取 DOM 文档节点并转换为 SimpleXML 节点:<?php $
- __new__: 对象的创建,是一个静态方法,第一个参数是cls。(想想也是,不可能是self,对象还没创建,哪来的self)__init_
- 在平常的项目中,经常会碰到这样的问题:我需要在一张标中同时更新和查询出来的数据。例如:有如下图一张表数据,现在需要更新操作为:把status
- 由于一些原因,需要SAE上站点的日志文件,从SAE上只能按天下载,下载下来手动处理比较蛋疼,尤其是数量很大的时候。还好SAE提供了API可以
- 今天的文章来自 盏茶作酒 同学。他在老电脑中发现了一个加密的 zip 文件,于是用 Python 破解了文件密码。在破解的过程中出现了内存爆
- K最近邻属于一种分类算法,他的解释最容易,近朱者赤,近墨者黑,我们想看一个人是什么样的,看他的朋友是什么样的就可以了。当然其他还牵着到,看哪
- 有了db模块,操作数据库直接写SQL就很方便。但是,我们还缺少ORM。如果有了ORM,就可以用类似这样的语句获取User对象:user =
- 图像轮廓Contours:轮廓轮廓是将没有连着一起的边缘连着一起。边缘检测检测出边缘,边缘有些未连接在一起。注意问题1.对象为二值图像,首先
- ceil()方法返回x的值上限 - 不小于x的最小整数。语法以下是ceil()方法的语法:import mathmath.cei
- Mysql的存储过程是从版本5才开始支持的,所以目前一般使用的都可以用到存储过程。今天分享下自己对于Mysql存储过程的认识与了解。一些简单
- functools模块提供了一些常用的高阶函数(处理其他可调用对象/函数的特殊函数;以函数作为输入参数,返回也是函数)。functools模
- 从文本文件中调出记录出现丢失换行?解决方法:<%Dim fsDim tsset fs=Server.Cr
- 以前游戏2048火的时候,正好用其他的语言编写了一个,现在学习python,正好想起来,便决定用python写一个2048,由于没学过pyt
- 本文实例讲述了Sanic框架Cookies操作。分享给大家供大家参考,具体如下:简介Sanic是一个类似Flask的Python 3.5+
- Runtime包GOMAXPROCS()用来设置可以并行计算的CPU核数最大值,并返回之前的值,具体使用方法上一篇有些,这里不再赘述Gosc