一、意义
一般产品在出货前都会进行压测,测试某项功能的稳定性,但是压测产生的log文件会非常大且多,还不知道问题是出现在哪个文件中的,因此每次分析压测的log就压力山大(有时候因为文件太大,用NotePad++都没法打开,甚是尴尬)。我这里自己写了一个python脚本,用于批量将每个文件中的关键字过滤出来,并去除无用的log。
二、具体实现
代码如下:
import stat
import sys
import os
import re
import time
TEMPDIRNAME = r"newDir"
TEMPFILENAME = r"[0-9]+.txt$"
TEMPCOMMON = []
def addDir(absolute_dir_path):
if not os.listdir(absolute_dir_path):
print("addDir dir is empty")
return
for name in sorted(os.listdir(absolute_dir_path)):
full_path = os.path.join(absolute_dir_path, name)
if os.path.isdir(full_path):
if TEMPDIRNAME in name:
os.rmdir(full_path)
else:
continue
else:
continue
# make a new dir to store new logcat
now_time = time.localtime()
now_time_format = time.strftime("%Y-%m-%d-%H_%M_%S", now_time)
global TEMPUPDIRNAME
TEMPUPDIRNAME = "/newDir" + now_time_format
new_dir_path = absolute_dir_path + TEMPUPDIRNAME
os.mkdir(new_dir_path)
def deleteFileFromDir(absolute_dir_path):
if not os.listdir(absolute_dir_path):
print("dir is empty")
return
addDir(absolute_dir_path)
for name in sorted(os.listdir(absolute_dir_path)):
full_path = os.path.join(absolute_dir_path, name)
if os.path.isdir(full_path):
if TEMPDIRNAME in name:
continue
else:
os.chmod(full_path, stat.S_IWOTH)
deleteFileFromDir(full_path)
else:
realLogcat = re.search(TEMPFILENAME, name, re.M | re.I)
if realLogcat is None:
print("this logcat is not need, will delete it")
os.unlink(full_path)
def moveLogcatToNewDir(absolute_dir_path):
if not os.listdir(absolute_dir_path):
print("dir is empty")
return
for name in sorted(os.listdir(absolute_dir_path)):
full_path = os.path.join(absolute_dir_path, name)
if os.path.isdir(full_path):
if TEMPDIRNAME in name:
print("moveLogcatToNewDir this dir is newDir, continue")
continue
else:
moveLogcatToNewDir(full_path)
else:
new_file = name[:-4]
new_file_path = absolute_dir_path + TEMPUPDIRNAME + "/" + new_file + "-new.txt"
try:
fileNew = open(new_file_path, "w", encoding='utf-8', errors='ignore')
print("Open %s " % (new_file_path))
except IOError:
print("Open %s failed!" % (new_file_path))
try:
fileObj = open(full_path, "r", encoding='utf-8', errors='ignore')
print("Open %s " % (full_path))
except IOError:
print("Open %s failed!" % (full_path))
context = fileObj.readline()
while context:
for i in range(0, len(TEMPCOMMON)):
if 0 < context.find(TEMPCOMMON[i]):
fileNew.write(context)
break
context = fileObj.readline()
def parseLogcatEntry(absolute_dir_path):
if not os.listdir(absolute_dir_path):
print("dir is empty")
return
deleteFileFromDir(absolute_dir_path)
moveLogcatToNewDir(absolute_dir_path)
if __name__ == "__main__":
#nargs='*' mean that you can input many args
parser = argparse.ArgumentParser(description="This script is mainly used to filter keywords from sitalog")
parser.add_argument("-k", "--keyword", nargs='*', required=True, help="filter one or more keyword")
parser.add_argument("-p", "--path", nargs=1, required=True, help="input the path of sitalog")
args = parser.parse_args()
if args.keyword:
TEMPCOMMON = args.keyword
if args.path:
global TEMPATH
list = args.path
TEMPATH = list[0]
parseLogcatEntry(TEMPATH)
上述代码主要考虑到以后可能会添加其他功能,所以对其层次进行了划分(如不考虑,十几行代码就可以完成功能):
① 添加(newDir+当前日期)目录,下面简称newDir,用于收录过滤后的log文件;
② 删减needless文件;
③ 将带有关键字的那一行日志放入新的log文件中保存。
这里不会改变有效的原生log文件,如果过滤后的log没有看到关键信息,可以替换关键字重新过滤。
具体使用方法如下:
①在有python的环境下,运行上述CameraTools.py文件:
python.exe绝对路径 CameraTools.py绝对路径 “关键字1” “关键字2” “关键字3”
eg:
E:\workspace\home\python_project\pythonProject\venv\Scripts\python.exe E:/workspace/home/python_project/pythonProject/CameraTools.py -p "D:\\firefox\\file\\sitalog" -k FreezeManager USBUFUUtils-JNI TCameraManager
这里参数-p后面输入的是sitalog路径;参数-k 后面输入的是需要过滤的关键字,关键字不可以"-"开头,如"-z",函数内部会进行检查,如有会视其为无效数据,并抛出异常。如果需要过滤带“-”关键词,需要修改对应parser.add_argument中narg的赋值为:
nargs=argparse.REMAINDER,这会将"-k"后所有的输入都当做有效数据(将-k用在最后,以免影响其他参数)。
② 直接进入到newDir目录下查看过滤后的log,过滤后的log名称为原有log名+“-new.txt”。
下面看下执行脚本前后的文件变化。
过滤前:
过滤后:
根目录下的子文件夹中如果也有log文件的话,也会在其内部创建newDir*文件夹来保存过滤后的日志。如上述目录haodada中有log,会将其过滤后的结果放在haodada->newDir中。
过滤后的文件:
这里的关键字为"FreezeManager" "USBUFUUtils-JNI" "TCameraManager",因此过滤后的文件内容如下:
过滤后,所有文件中只包含想要的日志。
当系统中有一套规则的添加log的方式时,如发生错误会有"ERROR"、"FAILED"、"WRONG"等关键字打印时,我们可以进行二次过滤,然后就可以提取出直接带有错误信息的日志(可以通过add_argument再添加一个参数,用于判断是否需要二次过滤,并实现相应的方法。这里二次过滤只要过滤newDir文件夹即可,相较简单)。
因为python不是很常用,所以上述python代码略显粗糙,而且有些冗余操作。后续有想法再来添加新功能,Bye~