计算日志信息里各性能所消耗的时间
日志信息如图
import re
import os
import csv
import argparse
#得到输入的参数,日志路径
def get_args():
parser = argparse.ArgumentParser(\
description="get cost time",\
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("-d", "--log_dir",\
required=True,\
help="the logs directory",\
dest="d")
args = parser.parse_args()
log_dir = args.d
return log_dir
#获取目录里所需的文件,并保存至list
def get_files(log_dir):
log_list = []
for root, dirs, files in os.walk(log_dir):
if not files:
continue
for file in files:
if file.endswith(".log") :
complete_path = os.path.join(root, file)
log_list.append(complete_path)
return log_list
#得到每一个需要统计的属性
def items_classify(file_name):
pattern = re.compile("](.*)cost time:\d+.\d+\(ms\)")
with open(file_name, "r") as f:
contents = f.read()
items = set(pattern.findall(contents))
f.close()
return contents, items
#匹配时间消耗
def items_match(contents, item):
number_list = []
pattern = re.compile("](.*)cost time:(\d+.\d+|\d)\(ms\)")
titles = pattern.findall(contents)
for i in range(len(titles)):
if item in titles[i]:
number_list.append(titles[i][1])
return item, number_list
#计算min, avg, max消耗
def calculate(number_list, item):
time_cost = 0
num = 0
for i in range(len(number_list)):
time_cost = float(number_list[i]) + time_cost
num += 1
avg_time = time_cost/num
max_time, min_time = compare_value(number_list)
save_result(item, min_time, round(avg_time, 3), max_time)
def compare_value(alist):
if alist != []:
max_value, min_value = alist[0], alist[0]
for x in alist:
if float(max_value) < float(x):
max_value = x
if float(min_value) > float(x):
min_value = x
return max_value, min_value
#将结果保存至CSV
def save_result(item, min_time, avg_time, #max_time):
csv_data = [item, min_time, avg_time, max_time]
print "%s: min=%s, avg=%s, max=%s"%(item ,min_time, avg_time, max_time)
with open("result1.csv", "ab") as f:
writer = csv.writer(f)
writer.writerow(csv_data)
f.close()
def work(log_dir):
#可根据实际情况选择单个文件或者文件夹
#file_names = get_files(log_dir)
#for file_name in file_names:
#if log_dir.endswith('.log'):
contents, items = items_classify(log_dir)
for item in items:
item, number_list = items_match(contents, item)
calculate(number_list, item)
def main():
log_dir = get_args()
work(log_dir)
if __name__ == "__main__":
main()