Heim  >  Artikel  >  Backend-Entwicklung  >  Beispiel für die Analyse von Nginx-Protokollen mit Python+Pandas

Beispiel für die Analyse von Nginx-Protokollen mit Python+Pandas

不言
不言Original
2018-04-28 15:37:262201Durchsuche

Das Folgende ist ein Beispiel für die Analyse von Nginx-Protokollen mit Python+Pandas. Es hat einen guten Referenzwert und ich hoffe, es wird für alle hilfreich sein. Werfen wir gemeinsam einen Blick darauf

Anforderungen

Durch die Analyse von Nginx-Zugriffsprotokollen erhalten Sie die maximale, minimale und durchschnittliche Antwortzeit jeder Schnittstelle und jedes Besuchs .

Implementierungsprinzip

Speichern Sie das Feld uriuriupstream_response_time des Nginx-Protokolls im Pandas-Datenrahmen und implementieren Sie es dann über Gruppierungs- und Datenstatistikfunktionen.

Umsetzung

1. Vorbereitung


#创建日志目录,用于存放日志
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. Code-Implementierung


#!/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 Die gedruckte Form lautet wie folgt:

Wichtige Punkte

1 ist relativ groß. Verwenden Sie beim Lesen nicht readlines() oder readline(), da dadurch alle Protokolle in den Speicher eingelesen werden und der Speicher voll wird. Daher wird hier die for line in fo-Iterationsmethode verwendet, die grundsätzlich keinen Speicher belegt.

2. Um Nginx-Protokolle zu lesen, können Sie pd.read_table(log_file, sep='', iterator=True) verwenden, aber der hier festgelegte Sep kann nicht normal mit der Aufteilung übereinstimmen, also teilen Sie Nginx zuerst mit Split auf , und speichern Sie es dann in Pandas.

3. Pandas bietet IO-Tools, um große Dateien in Blöcken zu lesen, verschiedene Blockgrößen zum Lesen zu verwenden und dann pandas.concat aufzurufen, um eine Verbindung zum DataFrame herzustellen

Verwandte Empfehlungen:


python3 pandas liest MySQL-Daten und fügt sie ein



Das obige ist der detaillierte Inhalt vonBeispiel für die Analyse von Nginx-Protokollen mit Python+Pandas. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn