Heim > Artikel > Backend-Entwicklung > Beispiel für die Analyse von Nginx-Protokollen mit Python+Pandas
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 herzustellenVerwandte 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!