Python:命令行+循环+日志采集

简介:日常测试中特别是在Linux环境下,会遇到需要测试某项程序是否能正常运行,并且观察是否出现error,warning的情况,同时对运行的次数或者运行的时间有着一些特定需求。这时一个封装好的程序脚本,可以帮助我们快速高效的完成这类事务。既需要命令行输入相关测项快速执行,又需要日志采集整个运行过程。

历史攻略:

Python:封装logging模块和引用

Python:re + log 通过正则表达式统计日志数据

Python:极简、实用、通用性极高的单终端并发测试脚本

Python:aiomultiprocess实现协程与多进程的强强联合

Python:装饰器click处理解析命令行参数

Python:解析命令行参数

案例源码:

# -*- coding: utf-8 -*-
# time: 2022/10/4 21:51
# file: collection.py
import os
import time
import logging
import argparse
import subprocess


class Logger:
    log_path = r"./"  # log_path

    def __init__(self):
        self.log_name = os.path.join(self.log_path, '%s.log' % time.strftime('%Y-%m-%d_%H_%M_%S'))
        self.logger = logging.getLogger()
        self.logger.setLevel(logging.DEBUG)

        self.formatter = logging.Formatter('[%(asctime)s] - %(filename)s] - %(levelname)s: %(message)s')

    def __console(self, level, message):

        fh = logging.FileHandler(self.log_name, 'a', encoding='utf-8')
        fh.setLevel(logging.DEBUG)
        fh.setFormatter(self.formatter)
        self.logger.addHandler(fh)

        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        ch.setFormatter(self.formatter)
        self.logger.addHandler(ch)

        if level == 'info':
            self.logger.info(message)
        elif level == 'debug':
            self.logger.debug(message)
        elif level == 'warning':
            self.logger.warning(message)
        elif level == 'error':
            self.logger.error(message)

        self.logger.removeHandler(ch)
        self.logger.removeHandler(fh)

        fh.close()

    def debug(self, message):
        self.__console('debug', message)

    def info(self, message):
        self.__console('info', message)

    def warning(self, message):
        self.__console('warning', message)

    def error(self, message):
        self.__console('error', message)


log = Logger()


def init_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("--cmd", required=True, type=str, help="shell or dos command.")
    parser.add_argument("--loop", default=1, required=False, type=int, help="how many times to run this command.")
    args = parser.parse_args()
    return args


def start(cmd, loop):
    log.info("\033[1;32m" + f"**************************************************" + "\033[0m")
    log.info("\033[1;31m" + f"cmd: {cmd}" + "\033[0m")
    log.info("\033[1;31m" + f"loop: {loop}" + "\033[0m")
    log.info("\033[1;32m" + f"**************************************************" + "\033[0m")


def finish(cmd, loop):
    log.info("\033[1;32m" + "All the command have been executed." + "\033[0m")
    log.info("\033[1;32m" + f"**************************************************" + "\033[0m")
    log.info("\033[1;31m" + f"cmd: {cmd}" + "\033[0m")
    log.info("\033[1;31m" + f"loop: {loop}" + "\033[0m")
    log.info("\033[1;32m" + f"**************************************************" + "\033[0m")


def run(cmd, loop=1):
    for i in range(loop):
        log.info("*" * 50)
        log.info("\033[1;32m" + f"{i + 1} / {loop} start" + "\033[0m")
        popen = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, bufsize=1)
        out, err = popen.communicate()
        log.info('std_err: ' + err)
        log.info('out: ' + out)
        log.info("\033[1;32m" + f"{i + 1} / {loop} finish" + "\033[0m")
        log.info("*" * 50)


if __name__ == "__main__":
    args = init_args()
    start(args.cmd, args.loop)
    run(args.cmd, args.loop)
    finish(args.cmd, args.loop)

执行效果:python3 main.py --cmd=“bash test.sh” --loop=3

=

图片

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值