python3 将项目日志 集中输出

原创 2018年04月17日 17:22:40

起因:

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

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

【Python】Python 日志实践之logging模块

在现实生活中,记录日志非常重要。银行转账时会有转账记录;飞机飞行过程中,会有黑盒子(飞行数据记录器)记录飞行过程中的一切。如果有出现什么问题,人们可以通过日志数据来搞清楚到底发生了什么。对于系统开发、...
  • ztf312
  • ztf312
  • 2017-12-25 15:10:10
  • 1049

python日志重复打印

Python日志重复打印问题 用Python的logging模块记录日志时,出现了重复输出日志的问题。这里我是把logger封装了一层: def init_logger(log_name, f...
  • u010314269
  • u010314269
  • 2018-03-14 11:15:21
  • 67

集中化Linux日志管理系统

笔者 工作中 负责 着 60 多 台Linux服务器的运维管理工作, 初期 每台机器日志的巡查,是一件相当耗时耗力的工作。后来经过 摸索 ,整理出一个非常适合各种规模的服务器的日志集中化管理,巡查流程...
  • a727756480
  • a727756480
  • 2014-03-25 14:30:20
  • 7063

tomcat项目日志问题

同一个tomcat中起了两个web应用,这两个应用都是用log4j进行日志打印,一份打到控制台,一份按天分割打到其他目录中去,但是两个项目存放日志的位置不一样。 现在遇到的问题有两点: 1.cat...
  • wc250025
  • wc250025
  • 2017-04-27 15:03:15
  • 891

python logging 日志详细配置

转载自伯乐在线 http://python.jobbole.com/81666/ 谢谢这位大哥的详细翻译在现实生活中,记录日志非常重要。银行转账时会有转账记录;飞机飞行过程中,会有黑盒子(飞行数据记...
  • liuxiaochen123
  • liuxiaochen123
  • 2015-09-01 11:38:52
  • 8090

Kafka+Log4j实现日志集中管理

第一部分 搭建Kafka环境 安装Kafka 下载:http://kafka.apache.org/downloads.html tar zxf kafka-.tgz cd kaf...
  • ASAS1314
  • ASAS1314
  • 2016-07-19 09:33:57
  • 3223

Log4j日志集中管理

最近遇到这样一个问题,公司线上有中、日、美三种语言的项目,隶属于不同的三台服务器,且每个项目都通过双节点配置,现想实现日志的统一管理,即将所有日志输入到同一台服务器上,然后进行统一记录、管理、分析。最...
  • ligang2585116
  • ligang2585116
  • 2015-01-23 23:20:05
  • 2153

tomcat+log4j,实现完美的WEB项目日志管理

tomcat+log4j,实现完美的WEB项目日志管理
  • zgzjw
  • zgzjw
  • 2004-09-05 10:31:00
  • 1854

详解rsyslog/Python/LogAnalyzer 记录和查看服务端/客户端日志

服务端和客户端所有信息通过独立日志系统记录可以使用单独的服务器存储和管理,实现权限分离,增强生产服务器的安全性,使用通用的格式方便分析日志,所有日志统一处理,客户端可以直接和日志服务器对话。 R...
  • fishmai
  • fishmai
  • 2016-07-06 13:56:47
  • 4238

python3中, print横向输出

Python 2 : print打印的时候,如果结尾有逗号,打出来时候不会换行。但是在python3里面就不行了。 Python3: 3.0的print最后加个参数end=""就...
  • akon_wang_hkbu
  • akon_wang_hkbu
  • 2017-09-25 14:52:02
  • 1596
收藏助手
不良信息举报
您举报文章:python3 将项目日志 集中输出
举报原因:
原因补充:

(最多只允许输入30个字)