python实现的分析并统计nginx日志数据功能示例
本文实例讲述了python实现的分析并统计nginx日志数据功能。分享给大家供大家参考,具体如下:
利用python脚本分析nginx日志内容,默认统计ip、访问url、状态,可以通过修改脚本统计分析其他字段。
一、脚本运行方式
pythoncount_log.py-fmed.xxxx.com.access.log
二、脚本内容
#!/usr/bin/python
#-*-coding:utf-8-*-
"""
1.分析日志,每行日志按空格切分,取出需要统计的相应字段,作为字典的key,遍历相加
2.使用到字典的get方法,通过定义默认值,避免misskey的错误
3.使用列表解析表达式
4.使用sorted函数排序列表
5.使用argparse传入参数
6.nginx日志格式:
log_formataccess_log
'$remote_addr-$remote_user[$time_local]$request'
'"$status"$body_bytes_sent"$http_referer"'
'"$http_user_agent""$request_time"''"$upstream_addr"''"$upstream_response_time"';
7.日志内容:
222.xx.xxx.15--[07/Dec/2016:00:03:27+0800]GET/app/xxx/xxx.apkHTTP/1.0"304"0"-""Mozilla/5.0Gecko/20100115Firefox/3.6""0.055""-""-"
8.脚本运行结果:
('106.xx.xx.46','/gateway/xxx/user/mxxxxx/submitSelfTestOfSingleQuestion','"200"',299)
('182.1xx.xx.83','/','"200"',185)
('222.xx.1xx.15','/','"200"',152)
('125.xx.2xx.58','/','"200"',145)
"""
importargparse
defcount_log(filename,num):
try:
withopen(filename)asf:
dic={}
forlinf:
ifnotl=='\n':#判断空白行
arr=l.split('')
ip=arr[0]
url=arr[6]
status=arr[8]
#字典的key是有多个元素构成的元组
#字典的get方法,对取的key的值加1,第一次循环时由于字典为空指定的key不存在返回默认值0,因此读第一行日志时,统计结果为1
dic[(ip,url,status)]=dic.get((ip,url,status),0)+1
#从字典中取出key和value,存在列表中,由于字典的key比较特殊是有多个元素构成的元组,通过索引k[#]的方式取出key的每个元素
dic_list=[(k[0],k[1],k[2],v)fork,vindic.items()]
forkinsorted(dic_list,key=lambdax:x[3],reverse=True)[:num]:
print(k)
exceptExceptionase:
print("openfileerror:",e)
if__name__=='__main__':
parser=argparse.ArgumentParser(description="传入日志文件")
#定义必须传入日志文件,使用格式-ffilename
parser.add_argument('-f',action='store',dest='filename',required=True)
#通过-n传入数值,取出最多的几行,默认取出前10
parser.add_argument('-n',action='store',dest='num',type=int,required=False,default=10)
given_args=parser.parse_args()
filename=given_args.filename
num=given_args.num
count_log(filename,num)
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python日志操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。