Maison  >  Article  >  développement back-end  >  Exemple d'analyse des journaux nginx avec python+pandas

Exemple d'analyse des journaux nginx avec python+pandas

不言
不言original
2018-04-28 15:37:262201parcourir

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn