当前位置: 首页 > 后端技术 > Python

如何使用Python统计分析访问日志?

时间:2023-03-26 01:52:25 Python

1.前言性能场景下业务模型的建立是性能测试中非常重要的一环。在我们的真实项目中,商业模式与线上商业模式不一样的案例太多了。可能有多种原因,大大降低了性能测试的价值。今天这篇文章,我想写的是最简单的逻辑。即从基于网关访问日志的统计分析,转变为特定场景下的通用业务模型。详细介绍请参考【14丨性能测试场景:如何理解业务模型?】通用业务场景模型。就是把这一天的所有业务数加在一起,然后把全天每笔业务的交易量加在一起,计算出每笔业务量所占的比例。2、前期工作首先,我们取出高峰日一天的网关访问日志。这里的例子大概有1400万+条记录[root@k8s-worker-4~]#wc-laccess.log14106419access.log至于网关访问日志如何配置,可以参考之前的文章SpringCloud日志在压力测试中。我们得到的访问日志内容一般如下:/Feb/2021:13:52:14+0800]"POST/mall-order/order/generateOrderHTTP/1.1"500133820152ms对应以下字段:地址、用户、zonedDateTime、方法、uri、协议、状态、contentLength、端口、持续时间。那么,我们的需求来了,如何获取各个接口网关处理时间的最大值、最小值、平均值和访问量。这里我扩展了获取各个接口的网关处理时间的统计分析,方便我们评估接口的性能。3、编写Python脚本完成数据分析我们知道在数据分析和机器学习领域一般推荐使用Python,因为这正是Python擅长的。在Python的数据分析工作中,Pandas的使用频率很高。如果我们日常的数据处理工作不是很复杂,通常可以使用几段Pandas代码对数据进行正则化。所以这里我们只需要将日志中的duration字段存储到pandas的基本数据结构DataFrame中,然后通过分组和数据统计功能来实现即可。整个工程包含4个部分:第一部分是数据加载,首先我们通过读取打开的文件将数据加载到内存中。注意当日志文件比较大时,不要使用readlines()或readline()来读取。所有的日志都会被读入内存,导致内存满。所以这里使用了forlineinfo迭代的方式,基本不占用内存,实现懒加载;第二步是数据预处理。读取日志文件可以使用pd.read_table(log_file,sep='',iterator=True),但是我们这里设置的sep不能正常匹配split,所以先用split对log进行拆分,然后存入熊猫;这三个步骤是数据分析。Pandas提供了IO工具,可以分块读取大文件,使用不同的块大小读取然后调用pandas.concat连接DataFrame,然后使用Pandas常用的统计函数进行分析;最后一步是数据加载,将统计分析结果保存到Excel文件中。下载依赖库:#pip3安装包名-i源url暂时改源#清华大学源:https://pypi.tuna.tsinghua.ed...#强大的数据结构库,用于数据分析、时间序列和统计等.pip3installpandas-ihttps://pypi.tuna.tsinghua.ed...#URL处理包pip3installurllib-ihttps://pypi.tuna.tsinghua.ed...#安装生成execl表格相关模块pip3installxlwt-ihttps://pypi.tuna.tsinghua.edu.cn/simple/具体代码如下:#统计各接口处理时间#请提前创建日志并设置logdirimportsysimportosimportpandasaspdfromurllib.parseimporturlparseimportre'''全局参数'''mulu=os.path.dirname(__file__)#日志文件存放路径logdir="D:\log"#Storelogs统计所需相关字段logfile_format=os.path.join(mulu,"access.log")print("readfromlogfile\n")'''os.list中每个文件的数据加载和预处理'''dir(logdir):logfile=os.path.join(logdir,eachfile)withopen(logfile,'r')asfo:forlineinfo:spline=line.split()#过滤字段中的异常部分ifspline[6]=="-":传递elifspline[6]=="GET":传递elifspline[-1]=="-":passelse:#解析成url地址parsed=urlparse(spline[6])#print('path:',parsed.path)#excludevalueparameterinterface=''.join([iforiinparsed.pathifnoti.isdigit()])#print(interface)#Rewritethefilewithopen(logfile_format,'a')asfw:fw.write(interface)fw.write('\t')fw.write(样条[-2])fw.write('\n')print("outputpanda")'''DataAnalysis'''#将统计字段读入dataframereader=pd.read_table(logfile_format,sep='\t',engine='python',names=["interface","duration(ms)"],header=None,iterator=True)loop=Truechunksize=10000000chunks=[]whileloop:try:chunk=reader.get_chunk(chunksize)chunks.append(chunk)exceptStopIteration:loop=Falseprint("Iterationisstopped.")df=pd.concat(chunks)#df=df.set_index("interface")#df=df.drop(["GET","-"])df_groupd=df.groupby('interface')df_groupd_max=df_grouppd.max()df_groupd_min=df_groupd.min()df_groupd_mean=df_groupd.mean()df_groupd_size=df_groupd.size()'''数据加载'''df_ana=pd.concat([df_groupd_max,df_groupd_min,df_groupd_meandg,df_sizesaxis=1,keys=["max","min","average","count"])print("输出excel")df_ana.to_excel("result.xls")运行结果:image.png这样我们就可以轻松得到高峰日业务量统计和接口处理时间等数据。4.小结通过今天的例子,我们应该可以看出Python的使用降低了性能工程师进行数据分析的技术门槛。相信在如今的DT时代,任何岗位都需要数据分析的思维和能力。本文源码:https://github.com/zuozewei/b...参考文献:[1]:《性能测试实战30讲》