python3 将项目日志 集中输出

起因:

    因为刚进入新公司,对业务需求不太熟悉,但工作强度比较大,系统模块较多(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

    转载请说明出处,谢谢!!!

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页