首頁  >  文章  >  後端開發  >  python+pandas分析nginx日誌的實例

python+pandas分析nginx日誌的實例

不言
不言原創
2018-04-28 15:37:262190瀏覽

下面為大家分享一篇python pandas分析nginx日誌的實例,具有很好的參考價值,希望對大家有幫助。一起來看看吧

需求

透過分析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.列印的表格如下:

要點

##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

相關推薦:


python3 pandas 讀取MySQL資料與插入



以上是python+pandas分析nginx日誌的實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn