分享

Python中的logging模块解析

 大傻子的文渊阁 2022-11-13

前言

自动化测试中,为了定位问题,调试框架代码,需要使用日志模块,今天我们重点讲解Python中的logging模块,在学习使用logging模块前,我们先要了解logging模块的四大天王:logger、handler、filter、formatter

一.logging模块的四大组件

logger:日志器,提供程序可使用的接口

handler:处理器,用于写入日志文件并输出到指定位置,如文件、控制台或网络等

filter:过滤器,用于输出符合指定条件的日志记录

formatter:格式器,决定日志记录的输出格式

二.如何使用logging模块---基本用法

1.创建logger对象,返回一个日志器

logger = logging.getlogger()

2.设置日志等级

logger.setLevel("DEBUG") #设置日志等级为debug

常见的日志级别有:DEBUG、INFO、WARNING、ERROR、CRITICAL,具体用法如下:

DEBUG:最低级别,追踪问题时使用

INFO:记录程序中一般事件的信息,或确认一切工作正常

WARNING:记录信息,用于警告

ERROR:用于记录程序报错信息

CRITICAL:最高级别,记录可能导致程序崩溃的错误

3.创建一个处理器对象

fh = logging.FileHandler(filename="bbb.log", mode='a', encoding="utf-8", delay=False) #创建一个文件处理器,日志输入文件,需要指定文件名称,写入的模式,编码格式等

4.创建一个格式器对象

fmt = logging.Formatter("[%(asctime)s]-[%(levelname)s]-[%(pathname)s]-[Line:%(lineno)d]-[LoggerInfo:%(message)s]") #一般格式器中要定义好日志产生时间,日志级别,产生日志的模块全路径,模块的哪一行,具体的日志信息等

5.为处理器添加格式

fh.setFormatter(fmt=fmt),将第4步中生成的格式器给第3步生成的处理器“吞吃”

6.为日志器添加处理方式

logger.addHandler(fh),将设置格式后的处理器对象给日志器“吞吃”,使日志器有处理日志的能力

7.调用日志器对象,生成日志

logger.debug("这是一个debug错误")

8.源码如下:

import logging #导入日志模块
logger = logging.getLogger() #创建日志器logger.setLevel(logging.DEBUG) #设置日志的打印级别fh = logging.FileHandler(filename="kkk.log",mode='a',encoding="utf-8") #创建日志处理器,用文件存放日志sh = logging.StreamHandler()#创建日志处理器,在控制台打印#创建格式器,指定日志的打印格式fmt = logging.Formatter("[%(asctime)s]-[%(levelname)s]-[%(filename)s]-[Line:%(lineno)d]-[Msg:%(message)s]")#给处理器设置格式fh.setFormatter(fmt=fmt)sh.setFormatter(fmt=fmt)#给日志器添加处理器logger.addHandler(fh)logger.addHandler(sh)#调用日志器logger.debug("ajffasfdsas")

三.优化

上面的日志的基本用法,没有做封装,实际工作中使用不方便,我们接下来将其进行封装,方便需要使用时,进行调用,同时将具体包括将日志按日期分别存放到不同的文件,日志名称以时间命名;具体方法如下:​​​​​​​

import logging,os,time
class Logging():
    def make_log_dir(self,dirname='logs'): #创建存放日志的目录,并返回目录的路径        now_dir = os.path.dirname(__file__)        father_path = os.path.split(now_dir)[0]        path = os.path.join(father_path,dirname)        path = os.path.normpath(path)        if not os.path.exists(path):            os.mkdir(path)        return path
    def get_log_filename(self):#创建日志文件的文件名格式,便于区分每天的日志        filename = "{}.log".format(time.strftime("%Y-%m-%d",time.localtime()))        filename = os.path.join(self.make_log_dir(),filename)        filename = os.path.normpath(filename)        return filename
    def log(self,level='DEBUG'):#生成日志的主方法,传入对那些级别及以上的日志进行处理        logger = logging.getLogger()#创建日志器        levle = getattr(logging,level) #获取日志模块的的级别对象属性        logger.setLevel(level)#设置日志级别        if not logger.handlers: #作用,防止重新生成处理器            sh = logging.StreamHandler()#创建控制台日志处理器            fh = logging.FileHandler(filename=self.get_log_filename(),mode='a',encoding="utf-8")#创建日志文件处理器            #创建格式器            fmt = logging.Formatter("%(asctime)s-%(levelname)s-%(filename)s-Line:%(lineno)d-Message:%(message)s")            #给处理器添加格式            sh.setFormatter(fmt=fmt)            fh.setFormatter(fmt=fmt)            #给日志器添加处理器,过滤器一般在工作中用的比较少,如果需要精确过滤,可以使用过滤器            logger.addHandler(sh)            logger.addHandler(fh)        return logger #返回日志器
if __name__ == '__main__':    logger = Logging().log(level='DEBUG') #调用封装的日志方法,生成处理后的日志器    logger.debug("1111111111111111111111") #使用日志器生成日志    logger.info("222222222222222222222222")    logger.error("附件为IP飞机外婆家二分IP文件放")    logger.warning("3333333333333333333333333333")    logger.critical("44444444444444444444444444")


这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…..

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多