用python批量过滤logcat中的关键字

一、意义

        一般产品在出货前都会进行压测,测试某项功能的稳定性,但是压测产生的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~

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值