通过分析nginx访问日志,获取每个接口响应时间最大值,最小值,平均值及访问量。
将nginx日志uriuriupstream_response_time字段存放到熊猫的dataframe中,然后通过分组,数据统计功能实现。
<强> 1。准备工作强>
#创建日志目录,用于存放日志 mkdir/home/test/python/log/log #创建文件,用于存放从nginx日志中提取的uri upstream_response_time美元字段 触摸/home/test/python/log/log.txt #安装相关模块 conda创建- n科学numpy scipy matplotlib熊猫 #安装生成execl表格的相关模块 pip安装xlwt
<强> 2。代码实现强>
# !/usr/地方/miniconda2/env/科学/bin/python # - * -编码:utf - 8 - * #统计每个接口的响应时间 #请提前创建log.txt并设置logdir 导入系统 进口操作系统 熊猫作为pd导入 姆鲁国家公园=os.path.dirname (__file__) #日志文件存放路径 logdir="/home/测试/python/日志/日志” #存放统计所需的日志相关字段 logfile_format=os.path.join(姆鲁国家公园,“log.txt”) 打印“读取日志文件\ n” 在os.listdir eachfile (logdir): 日志文件=os.path.join (logdir eachfile) 张开(日志文件,“r”): 的线: 花键=line.split () #过滤字段中异常部分 如果样条[6]==?”: 通过 elif花键[6]==暗玫健? 通过 elif花键[1]==?”: 通过 其他: 张开(logfile_format a)弗兰克-威廉姆斯: fw.write(花键[6]) fw.write (‘\ t’) fw.write(花键[1]) fw.write (“\ n”) 打印“输出熊猫” #将统计的字段读入到dataframe中 读者=pd。read_table (logfile_format, 9=\ t,引擎=皃ython”,名字=(“接口”、“reponse_time”),头=None,迭代器=True) 循环=True chunksize=10000000 块=[] while循环: 试一试: 块=reader.get_chunk (chunksize) chunks.append(块) 除了抛出StopIteration: 循环=False 打印“迭代停止。” df=pd.concat(块) # df=df.set_index(接口) # df=df.drop((“得到”,“-”)) df_groupd=df.groupby(接口) df_groupd_max=df_groupd.max () df_groupd_min=df_groupd.min () df_groupd_mean=df_groupd.mean () df_groupd_size=df_groupd.size () #打印df_groupd_max #打印df_groupd_min #打印df_groupd_mean df_ana=pd.concat ([df_groupd_max、df_groupd_min df_groupd_mean, df_groupd_size],轴=1,键=[“max”,“分”,“一般”,“数”)) 打印“产出excel” df_ana.to_excel (test.xls)
<强> 3。打印的表格如下:强>
1。日志文件比较大的情况下读取不要用readline (), readline(),会将日志全部读到内存,导致内存占满,因此在此使用fo迭的线代的方式,基本不占内存。
2。读取nginx日志,可以使用pd。read_table (log_file, 9=' ',迭代器=True),但是此处我们设置的9月无法正常匹配分割,因此先将nginx用分裂分割,然后再存入熊猫。
3。熊猫提供了IO工具可以将大文件分块读取,使用不同分块大小来读取再调用熊猫。concat连接DataFrame
以上这篇python +熊猫分析nginx日志的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。