python+pandas分析nginx日志的实例

作者:man8er 时间:2021-03-13 12:51:22 

需求

通过分析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

来源:https://blog.csdn.net/yanggd1987/article/details/69542669

标签:python,nginx,日志,pandas
0
投稿

猜你喜欢

  • python 将对象设置为可迭代的两种实现方法

    2023-08-24 18:01:39
  • 在SQL Server中使用CLR调用.NET方法

    2008-12-24 15:43:00
  • 图解Python中浅拷贝copy()和深拷贝deepcopy()的区别

    2021-12-09 21:09:39
  • Python类中的魔法方法之 __slots__原理解析

    2023-10-01 18:49:51
  • python 使用get_argument获取url query参数

    2023-02-12 03:52:18
  • 实例演示在SQL中启用全文检索

    2011-10-01 14:01:37
  • 详解python中的文件与目录操作

    2023-10-15 06:15:03
  • 利用PyQt5生成过年春联

    2023-05-23 21:14:22
  • Django使用HTTP协议向服务器传参方式小结

    2023-03-08 11:31:20
  • sklearn线性逻辑回归和非线性逻辑回归的实现

    2021-06-16 04:04:31
  • Python中使用PyHook监听鼠标和键盘事件实例

    2022-03-23 16:53:22
  • Pytorch反向求导更新网络参数的方法

    2021-02-07 11:48:52
  • Oracle 当前用户下所有表的记录总数

    2009-07-14 21:34:00
  • python Django编写接口并用Jmeter测试的方法

    2021-12-07 21:47:09
  • ASP 隐藏下载地址及防盗链代码

    2011-02-26 11:17:00
  • python中uuid模块实例浅析

    2022-06-16 01:01:24
  • MYSQL的DATE_FORMAT()格式化日期

    2009-02-27 16:04:00
  • 在Python中使用M2Crypto模块实现AES加密的教程

    2022-09-29 17:43:59
  • 在python中利用dict转json按输入顺序输出内容方式

    2021-10-26 15:17:23
  • Python字符串str和json格式相互转换

    2023-01-21 03:26:25
  • asp之家 网络编程 m.aspxhome.com