起因:
因为刚进入新公司,对业务需求不太熟悉,但工作强度比较大,系统模块较多(10+个),日志文件分散(每个模块都有个单独日志),给开发定位问题常常出现定位不准,缺陷提交给错误的开发。决定写下这个脚本,希望对其他人有帮助。
开发环境:win10 + python3.6.4
运行环境:linux + python3.6.5
代码:
import time import threading import configparser def readfile(pathlist,file): # 将文件路径与文件名组合起来,返回list file_name = [] for i in pathlist: file_name.append(i + file) return file_name def writefile(thefile,Modules,ini): # 写文件 logfile = open(thefile,'r') logfile.seek(0,2) # 目标文件路径,与文件名获取 conf = configparser.ConfigParser() conf.read(ini) with open(conf.get('target','pathandname'), 'a') as f: while True: line = logfile.readline() if not line: time.sleep(0.001) continue # 将模块名和日志内容输出 f.write(Modules+line) # 将缓存的剩余内容全部打印出来,不加flush,日志文件会被截取 f.flush() def name(ini): # 读取模块名,ini文件“:”前面的字符串,返回list conf = configparser.ConfigParser() conf.read(ini) list1 = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] name = [] for i in range(len(list1)): if conf.get('path', list1[i]) != '': a = conf.get('path', list1[i]) name.append(a.split(':')[0].ljust(10)) return name def path(ini): # 读取模块名,ini文件“:”后面的字符串,返回list conf = configparser.ConfigParser() conf.read(ini) list1 = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] path = [] for i in range(len(list1)): if conf.get('path', list1[i]) != '': a = conf.get('path', list1[i]) path.append(a.split(':')[1]) return path if __name__ == '__main__': # 日志名根据时间参数化 date = time.strftime("%Y_%m_%d", time.localtime()) logmodual = name("conf.ini") logpath = path("conf.ini") logname = date+".stderrout.log" file = readfile(logpath,logname) # 多线程处理,实时读取多个日志文件,并打印到同一个文件 threads = [] for i in range(len(logmodual)): t = threading.Thread(target=writefile, args=(file[i], logmodual[i], "conf.ini")) threads.append(t) for i in range(len(logmodual)): threads[i].start() for i in range(len(logmodual)): threads[i].join()
下一段为命名为conf.ini的配置文件。
[path] 1 = ASSET:/hsdata/logs/jettyASSET/ 2 = BATCH:/hsdata/logs/jettyBATCH/ 3 = CC:/hsdata/logs/jettyCC/ 4 = CREDIT:/hsdata/logs/jettyCREDIT/ 5 = DATACENTER:/hsdata/logs/jettyDATACENTER/ 6 = FLOW:/hsdata/logs/jettyFLOW/ 7 = 8 = MARKET:/hsdata/logs/jettyMARKET/ 9 = PRODUCT:/hsdata/logs/jettyPRODUCT/ 10 = TAMC:/hsdata/logs/jettyTAMC/ 11 = 12 = 13 = 14 = 15 = 16 = 17 = 18 = 19 = 20 = [target] pathandname = /hsdata/logs/alllog/all.log
以下为启动和停止的shell
#!/bin/sh source /home/p2p/.bashrc python22 test2.py &
#!/bin/sh ps -ef| grep test2.py | grep -v grep | awk '{print $2}' | xargs kill -9
由于linux自带的paython没有configparser的包,运行报错,于是自己下载了python3.6.5运行。又因为linux没有root权限,只能自己编写了自己用户的.bashrc文件,将python22编写成python3.6.5的启动命令。
结果:
使用tail命令打印出的日志效果如下,日志集中在一个文件实时显示。并且根据模块不同,在每一行开头加入模块名称
总结:
该工具能提高测试人员与开发人员定位问题时的工作效率,大约可减少10%-30%的工作量:
1、该工具节省了大量错误日志的定位时间;
2、该工具免去了打开多个Xshell窗口跟进日志文件的麻烦;
该工具存在的问题:
1、无法跟进多台服务器的日志;
2、性能消耗较高,由于日志是毫秒级,所以该脚本读写操作也是毫秒级,读写操作量较大,需要消耗单个CPU线程的30%,性能测试可能会影响测试结果;
PS:该工具后期可作为日志实时分析工具的基础文件。
对该脚本有任何优化建议可与我联系,本人QQ:492181115
转载请说明出处,谢谢!!!