Maison > Article > développement back-end > Exemple d'analyse des journaux nginx avec python+pandas
Ce qui suit est un exemple d'analyse des journaux nginx à l'aide de python+pandas. Il a une bonne valeur de référence et j'espère qu'il sera utile à tout le monde. Jetons un coup d'oeil ensemble
Exigences
En analysant les logs d'accès nginx, obtenez le temps de réponse maximum, minimum et moyen de chaque interface et visite .
Principe de mise en œuvre
Stockez le champ uriuriupstream_response_time du journal nginx dans la trame de données pandas, puis implémentez-le via des fonctions de regroupement et de statistiques de données.
Mise en œuvre
1.Préparation
#创建日志目录,用于存放日志 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. Implémentation du code
#!/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. Le formulaire imprimé est le suivant :
Points clés
1. Fichier journal N'utilisez pas readlines() ou readline() lors de la lecture d'un fichier relativement volumineux. Tous les journaux seront lus dans la mémoire, ce qui entraînera une saturation de la mémoire. Par conséquent, la méthode d'itération for line in fo est utilisée ici, qui n'occupe fondamentalement pas de mémoire.
2. Pour lire les journaux nginx, vous pouvez utiliser pd.read_table(log_file, sep=' ', iterator=True), mais le sep que nous définissons ici ne peut pas correspondre normalement à la division, donc divisez d'abord nginx avec split , puis enregistrez-le sur pandas.
3. Pandas fournit des outils IO pour lire des fichiers volumineux en morceaux, utiliser différentes tailles de morceaux pour lire, puis appeler pandas.concat pour se connecter à DataFrame
Recommandations associées :
python3 pandas lit les données MySQL et les insère
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!