>백엔드 개발 >파이썬 튜토리얼 >python+pandas를 사용하여 nginx 로그를 분석하는 예

python+pandas를 사용하여 nginx 로그를 분석하는 예

不言
不言원래의
2018-04-28 15:37:262259검색

다음은 python+pandas를 사용하여 nginx 로그를 분석하는 예입니다. 좋은 참고 가치가 있으며 모든 사람에게 도움이 되기를 바랍니다. 함께 살펴보겠습니다

Requirements

nginx 액세스 로그를 분석하면 각 인터페이스 응답 시간의 최대, 최소, 평균 및 액세스 시간을 얻을 수 있습니다.

구현 원칙

nginx 로그 uriuriupstream_response_time 필드를 pandas 데이터 프레임에 저장한 후 그룹화 및 데이터 통계 기능을 통해 구현합니다.

구현

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 iteration 방식을 사용한다.

2. nginx 로그를 읽으려면 pd.read_table(log_file, sep=' ', iterator=True)을 사용할 수 있지만 여기서 설정한 sep는 정상적으로 분할과 일치할 수 없으므로 먼저 nginx를 분할한 후 저장하세요. 팬더.

3. Pandas는 대용량 파일을 청크로 읽고, 다양한 청크 크기를 사용하여 읽은 다음 pandas.concat을 호출하여 DataFrame에 연결하는 IO 도구를 제공합니다

관련 권장 사항:

python3 pandas를 사용하여 MySQL 데이터를 읽고



위 내용은 python+pandas를 사용하여 nginx 로그를 분석하는 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.