一、需求背景和目标
对python脚本传参实现对时间区间的控制,输出该时间区间内的GPU使用记录,即该时间区间内的log文件内容。
本文章记录需求实现第二部分:获取log文件中的内容保存在df中,便于后续绘制折线图。
二、实现思路
由于需要传参确定时间区间,所以需要根据log文件名和gpu_time确定该条信息是否处于参数期间。首先要筛选出log文件中的内容
三、代码实现
import sys
import os
import argparse
import datetime as dt
from datetime import datetime
# 获取地址
proj_path = r'/home/gpu_usage_monitor'
sys.path.append(proj_path)
# 筛选log文件
def filter_logs(start_time,end_time):
# 对传入的字符串转换为时间格式
start_time = datetime.strptime(start_time,"%Y-%m-%d")
end_time = datetime.strptime(end_time,"%Y-%m-%d")
filtered_log = []
log_floder = os.path.join(proj_path,'usage_log')
#遍历访问usage_log文件夹,log文件均记录在该文件夹中
for filename in os.listdir(log_floder):
# 提取log文件命名中的日期,便于和传入的参数比较
file_date_str = filename.split("_")[2].split(".")[0] #log文件命名为gpu_usage_yyyy_mm_dd.log
file_datetime = datetime.strptime(file_date_str,"%Y-%m-%d")
# 筛选符合用户输入的时间区间的log文件
if start_time.date() <= file_datetime.date() <= end_time.date():
with open(os.path.join(log_floder,filename),'r') as file:
lines = file.readlines()
# 若传入的参数格式为yyyy-mm-dd,用这个
for i in lines[1:]:
filtered_log.append(i.strip())
'''# 若传入的参数格式为yyyy-mm-dd H:M:S,用这个
for i in lines[1:]:
columns = i.strip().split(',')
use_datetime = datetime.strptime(f"20{columns[0]} {columns[1]}","%Y-%m-%d %H:%M:%S")
if start_time <= use_datetime <= end_time:
filtered_log.append(i.strip())
'''
return filtered_log
if __name__ =="__main__":
today = dt.date.today()
parser = argparse.ArgumentParser(description="filter logs by time range")
# 如果不传参,默认参数为2023-08-18到当天
parser.addargument("start_time",type=str,default='2023-08-18',required=False,help="start_time in the format 'yyyy-mm-dd'")
parser.addargument("end_time",type=str,default=today,required=False,help="end_time in the format 'yyyy-mm-dd'")
args = parser.parser_args()
filter_logs(args.start_time,args.end_time)
四、实现效果
不传参的情况,log文件内从11点20开始有的数据:
传参的调用语句:python3 gpu_uasge_jpg.py --start_time '2023-08-17' --end_time '2023-08-18'