代码改变世界

nginx日志的python分析脚本

2022-09-28 19:17  第二个卿老师  阅读(336)  评论(0编辑  收藏  举报

因为容量场景需要统计峰值时间段的业务分布情况,即是统计每个接口请求以及对应的数量,这里记录下之前的实现脚本。

nginx的日志格式如下:

 代码如下:

import os,json
import pandas as pd
import datetime


'''
全局参数
'''

# 日志文件存放目录
logDir = r"C:\Users\qgc\Desktop"
# 源日志文件,3天汇总
logFile= r"C:\Users\qgc\Desktop\nginx.log"
# 清洗完的文件绝对路径
date = datetime.datetime.strftime(datetime.datetime.now(), '%H%M')
print(date)
resultName = logDir+"\\result-" + date +".xlsx"

print ('开始数据预处理')

# 定义过滤函数,过滤掉无效uri
filt = ['.js','css','images','static']
filt2 = ['/deme/']
def filter_invalid_str(s,filt):
    if s.isdigit() or s == '/' or s =='/null':
        return 0
    for i in filt:
        if i in s:
            return 0
    for j in filt2:
        if j not in s:
            return 0
    else:
        return 1

print('开始数据分析')


# 统计各个uri的访问量,算出日业务量,过滤掉请求次数为0的uri
def uri_statistics(time):
    result = {}
    count = 0
    with open(logFile, 'r', encoding="utf-8") as fr:
        for i in fr:
            line = i.split()
            if time in line[3]:
                k = line[6].split("?")[0]
                if filter_invalid_str(k,filt):
                    count+=1
                    if k not in result.keys():
                        result[k] = 1
                    elif k in result.keys():
                        result[k] += 1
                    else:
                        print("%s 存入字典时,key没有找到!"%k)
    print(f"共分析{count}条数据,找到{len(result)}接口数据")
    if len(result) >0:
        # 将清洗完的接口统计数据写入目标文件
        if os.path.exists(resultName):
            os.remove(resultName)
        pandas_to_excel(resultName, result)
    else:
        print("未生成txt数据")

def pandas_to_excel(f, data):
    file_path = pd.ExcelWriter(f)
    try:
        df = pd.DataFrame(pd.Series(data), columns=['total'])
        df = df.reset_index().rename(columns={'index': 'apiUri'})
        df.to_excel(file_path, encoding='utf-8')
        file_path.save()
    except Exception as e:
        print("Error:", e)
    print("excel处理数据成功")


if __name__ == '__main__':
    time = "13/Jul/2022:09"  //自定义日期时间,这里是指定13日9点的一小时数据。
    uri_statistics(time)

 代码运行结果如下:

 

 上面这个表格,可以用excel自带的计算公式计算下百分比,就可以得到业务的分布比例。