python+pandas 분석 nginx 로그 의 인 스 턴 스

수요
nginx 접근 로 그 를 분석 하여 모든 인터페이스 응답 시간 최대 치,최소 치,평균 값 과 방 문 량 을 가 져 옵 니 다.
실현 원리
nginx 로그 uriupstreamresponse_time 필드 는 pandas 의 dataframe 에 저장 한 다음 그룹,데이터 통계 기능 을 통 해 이 루어 집 니 다.
이루어지다
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 
" 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('
') 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 교체 방식 을 사용 하면 메모리 가 거의 차지 하지 않 습 니 다.
2.nginx 로 그 를 읽 고 pd.read 를 사용 할 수 있 습 니 다.table(log_file,sep=',iterator=True).그러나 여기 서 우리 가 설정 한 sep 는 분할 과 정상적으로 일치 하지 않 기 때문에 nginx 를 split 으로 분할 한 다음 pandas 에 저장 합 니 다.
3.Pandas 는 큰 파일 을 블록 으로 나 누 어 읽 을 수 있 는 IO 도 구 를 제공 합 니 다.블록 크기 에 따라 읽 고 pandas.concat 연결 DataFrame 을 호출 합 니 다.
이상 의 python+pandas 분석 nginx 로그 의 인 스 턴 스 는 바로 작은 편집 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.여러분 들 도 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기