python+pandas分析nginx日志的實例
需求
通過分析nginx訪問日志,獲取每個接口響應(yīng)時間最大值、最小值、平均值及訪問量。
實現(xiàn)原理
將nginx日志uriuriupstream_response_time字段存放到pandas的dataframe中,然后通過分組、數(shù)據(jù)統(tǒng)計功能實現(xiàn)。
實現(xiàn)
1.準(zhǔn)備工作
#創(chuàng)建日志目錄,用于存放日志 mkdir /home/test/python/log/log #創(chuàng)建文件,用于存放從nginx日志中提取的$uri $upstream_response_time字段 touch /home/test/python/log/log.txt #安裝相關(guān)模塊 conda create -n science numpy scipy matplotlib pandas #安裝生成execl表格的相關(guān)模塊 pip install xlwt
2.代碼實現(xiàn)
#!/usr/local/miniconda2/envs/science/bin/python #-*- coding: utf-8 -*- #統(tǒng)計每個接口的響應(yīng)時間 #請?zhí)崆皠?chuàng)建log.txt并設(shè)置logdir import sys import os import pandas as pd mulu=os.path.dirname(__file__) #日志文件存放路徑 logdir="/home/test/python/log/log" #存放統(tǒng)計所需的日志相關(guān)字段 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" #將統(tǒng)計的字段讀入到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(),會將日志全部讀到內(nèi)存,導(dǎo)致內(nèi)存占滿。因此在此使用for line in fo迭代的方式,基本不占內(nèi)存。
2. 讀取nginx日志,可以使用pd.read_table(log_file, sep=' ‘, iterator=True),但是此處我們設(shè)置的sep無法正常匹配分割,因此先將nginx用split分割,然后再存入pandas。
3. Pandas提供了IO工具可以將大文件分塊讀取,使用不同分塊大小來讀取再調(diào)用 pandas.concat 連接DataFrame
以上這篇python+pandas分析nginx日志的實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Python解析nginx日志文件
- python實現(xiàn)分析apache和nginx日志文件并輸出訪客ip列表的方法
- Python 分析Nginx訪問日志并保存到MySQL數(shù)據(jù)庫實例
- python正則分析nginx的訪問日志
- 寫了個監(jiān)控nginx進程的Python腳本
- Python運維自動化之nginx配置文件對比操作示例
- 在Linux系統(tǒng)上通過uWSGI配置Nginx+Python環(huán)境的教程
- 使用python刪除nginx緩存文件示例(python文件操作)
- python實現(xiàn)的分析并統(tǒng)計nginx日志數(shù)據(jù)功能示例
相關(guān)文章
Python的Django框架中消息通知的計數(shù)器實現(xiàn)教程
通知的計數(shù)器非常有用,新通知時+1和讀過通知后的-1是最基本的功能,這里我們就來看一下Python的Django框架中消息通知的計數(shù)器實現(xiàn)教程2016-06-06NumPy實現(xiàn)結(jié)構(gòu)化數(shù)組的示例代碼
結(jié)構(gòu)化數(shù)組是 NumPy 中用于處理異質(zhì)數(shù)據(jù)的重要工具,通過定義復(fù)雜的數(shù)據(jù)類型,我們可以創(chuàng)建具有不同字段的數(shù)組,本文主要介紹了NumPy實現(xiàn)結(jié)構(gòu)化數(shù)組的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-01-01pandas中的ExcelWriter和ExcelFile的實現(xiàn)方法
這篇文章主要介紹了pandas中的ExcelWriter和ExcelFile的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Python PyQt5標(biāo)準(zhǔn)對話框用法示例
這篇文章主要介紹了Python PyQt5標(biāo)準(zhǔn)對話框用法,結(jié)合實例形式分析了PyQt5常用的標(biāo)準(zhǔn)對話框及相關(guān)使用技巧,需要的朋友可以參考下2017-08-08