python+pandas分析nginx日志的实例


Posted in Python onApril 28, 2018

需求

通过分析nginx访问日志,获取每个接口响应时间最大值、最小值、平均值及访问量。

实现原理

将nginx日志uriuriupstream_response_time字段存放到pandas的dataframe中,然后通过分组、数据统计功能实现。

实现

1.准备工作

#创建日志目录,用于存放日志
mkdir /home/test/python/log/log
#创建文件,用于存放从nginx日志中提取的$uri $upstream_response_time字段
touch /home/test/python/log/log.txt
#安装相关模块
conda create -n science numpy scipy matplotlib pandas
#安装生成execl表格的相关模块
pip install xlwt

2.代码实现

#!/usr/local/miniconda2/envs/science/bin/python
#-*- coding: utf-8 -*-
#统计每个接口的响应时间
#请提前创建log.txt并设置logdir
import sys
import os
import pandas as pd
mulu=os.path.dirname(__file__)
#日志文件存放路径
logdir="/home/test/python/log/log"
#存放统计所需的日志相关字段
logfile_format=os.path.join(mulu,"log.txt")
print "read from logfile \n"
for eachfile in os.listdir(logdir):
 logfile=os.path.join(logdir,eachfile)
 with open(logfile, 'r') as fo:
  for line in fo:
   spline=line.split()
   #过滤字段中异常部分
   if spline[6]=="-":
    pass
   elif spline[6]=="GET":
    pass
   elif spline[-1]=="-":
    pass
   else:
    with open(logfile_format, 'a') as fw:
     fw.write(spline[6])
     fw.write('\t')
     fw.write(spline[-1])
     fw.write('\n')
print "output panda"
#将统计的字段读入到dataframe中
reader=pd.read_table(logfile_format,sep='\t',engine='python',names=["interface","reponse_time"] ,header=None,iterator=True)
loop=True
chunksize=10000000
chunks=[]
while loop:
 try:
  chunk=reader.get_chunk(chunksize)
  chunks.append(chunk)
 except StopIteration:
  loop=False
  print "Iteration is stopped."
df=pd.concat(chunks)
#df=df.set_index("interface")
#df=df.drop(["GET","-"])
df_groupd=df.groupby('interface')
df_groupd_max=df_groupd.max()
df_groupd_min= df_groupd.min()
df_groupd_mean= df_groupd.mean()
df_groupd_size= df_groupd.size()
#print df_groupd_max
#print df_groupd_min
#print df_groupd_mean
df_ana=pd.concat([df_groupd_max,df_groupd_min,df_groupd_mean,df_groupd_size],axis=1,keys=["max","min","average","count"])
print "output excel"
df_ana.to_excel("test.xls")

3.打印的表格如下:

python+pandas分析nginx日志的实例

要点

1. 日志文件比较大的情况下读取不要用readlines()、readline(),会将日志全部读到内存,导致内存占满。因此在此使用for line in fo迭代的方式,基本不占内存。

2. 读取nginx日志,可以使用pd.read_table(log_file, sep=' ‘, iterator=True),但是此处我们设置的sep无法正常匹配分割,因此先将nginx用split分割,然后再存入pandas。

3. Pandas提供了IO工具可以将大文件分块读取,使用不同分块大小来读取再调用 pandas.concat 连接DataFrame

以上这篇python+pandas分析nginx日志的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
pycharm 使用心得(一)安装和首次使用
Jun 05 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
Apr 13 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
Jul 04 Python
centos6.7安装python2.7.11的具体方法
Jan 16 Python
python pandas dataframe 按列或者按行合并的方法
Apr 12 Python
Python利用神经网络解决非线性回归问题实例详解
Jul 19 Python
flask框架路由常用定义方式总结
Jul 23 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
Nov 08 Python
python中p-value的实现方式
Dec 16 Python
Python捕获异常堆栈信息的几种方法(小结)
May 18 Python
python subprocess pipe 实时输出日志的操作
Dec 05 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 #Python
python实现关键词提取的示例讲解
Apr 28 #Python
python实现扫描日志关键字的示例
Apr 28 #Python
python socket网络编程之粘包问题详解
Apr 28 #Python
在Windows中设置Python环境变量的实例讲解
Apr 28 #Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 #Python
对Python中type打开文件的方式介绍
Apr 28 #Python
You might like
介绍php设计模式中的工厂模式
2008/06/12 PHP
php的ajax框架xajax入门与试用介绍
2010/12/19 PHP
PHP实现仿Google分页效果的分页函数
2015/07/29 PHP
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
PHP实现负载均衡session共享redis缓存操作示例
2018/08/22 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
用Python编写一个国际象棋AI程序
2014/11/28 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
利用pyinstaller打包exe文件的基本教程
2019/05/02 Python
Python中使用双下划线防止类属性被覆盖问题
2019/06/27 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
使用Django搭建web服务器的例子(最最正确的方式)
2019/08/29 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
Python extract及contains方法代码实例
2020/09/11 Python
用CSS3写的模仿iPhone中的返回按钮
2015/04/04 HTML / CSS
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
结婚周年感言
2014/02/24 职场文书
赡养老人协议书
2014/04/21 职场文书
运动会演讲稿100字
2014/08/25 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
介绍信范文
2015/01/31 职场文书
九华山导游词
2015/02/03 职场文书
甲午大海战观后感
2015/06/02 职场文书
MySQL查询日期时间
2022/05/15 MySQL
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis