python-logging日志管理学习2-Airtest日志管理解读预热

python-logging日志管理学习2

原创: George555     公众号:测试江湖路 

如果这些内容对你有帮助,也可以打开微信扫一扫,加关注:

接上篇【python-logging日志管理学习1】

 

                                                            第二篇 logging使用方法二(日志流处理)

    第2种方法是日志流处理流程的方式,采用一个模块级别的函数,即logging.getLogger([name]),返回logger对象,若不指定name则返回root logger。

    1.logging的4大组件 对应类名

    Logger:日志器,提供了应用程序可一直使用的接口

    Handler:处理器,将logger创建的日志记录发送到合适的目的输出

    Filter:过滤器,提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录

    Formatter:格式器,决定日志记录的最终输出格式

    2.这4大组件怎么配合使用?

    以Logger为入口,拿到日志,利用handler来干活去处理日志,期间handler可以决定是否通过Filter来过滤哪些日志,并且用Formatter来决定以什么格式去处理。

    第1步:Logger通过Handler来把日志输出到指定位置,比如文件、sys.stdout、sys.stderr、网络。

    第2步:Logger可以设置多个Handler来处理一条日志,这样多个不同Handler就可以把这一条日志输出到对应的不同位置。

    第3步:每个Handler都可以设置自己的Filter来过滤需要的日志

    第4步:每个Handler也可以使之自己的Formatter日志格式,从让一条日志以不同方式输出到不同位置。

    3.Logger类

        3.1 Logger作用

        A.在代码中调用写日志的方法比如:Logger.debug(), Logger.info()等,保持在代码运行过程中记录日志内容;

        B.对日志进行过滤,基于日志的严重级别如:Logger.setLevel() 或者过滤器Filter,从而确定哪些日志要在后续进行输出处理;

        C.把日志内容发送给所有创建的Handler

        注意:Logger对象的创建一般使用logging.getLogger(name),name是可选参数,如果不指定name则默认值为root,如果多次调用getLogger()方法的name值相同,将会返回指向同一个logger对象的引用。多次创建logger会重复输出日志。

        还有一种方式是对Logger类进行实例化logging.Logger()来创建logger对象。常用第一种。

        3.2 Logger的配置相关方法

        Logger.setLevel():设置日志最低处理级别

        Logger.addHandler() :添加handler对象

        Logger.removeHandler():删除handler对象

        Logger.addFilter() :添加filter过滤器

        Logger.removeFilter():删除filter过滤器

        3.3 Logger发送日志相关方法   具体使用见第1篇中的日志级别

        Logger.debug():创建debug日志记录

        Logger.info():创建info日志记录

        Logger.warning():创建warning日志记录

        Logger.error():创建error日志记录

        Logger.critical():创建critical日志记录

        Logger.exception():创建Logger.error()日志记录

        Logger.log():创建指定level级别的日志记录,传入level参数,参数为整数

        3.4 Logger层级结构使用

        创建logger时,如logging.getLogger(name),name是一个用'.'来分割的层级结构。比如logging.getLogger(a.b.c)  a.b.c是a.b的children后代,a.b和a.b.c都是a的children后代。

        logger如果没有明确设置level,那么此logger就用它的parent的level,比如示例1中a.b.c中没有设置level,则a.b.c就用a.b的level.a.b再没有就用a的level,最后一层会找到root logger层,而root logger层默认level是WARNING。

import logginglogger=logging.getLogger('test')logger2=logging.getLogger('test.a') #设置级别为ERRORlogger3=logging.getLogger('test.b') logger2.setLevel('ERROR')if __name__ == '__main__':    print(logger)    print(logger2)        print(logger3)

输出:​​​​​​​

<Logger test (WARNING)><Logger test.a (ERROR)><Logger test.b (WARNING)>

        代码说明:logger3未设置level,继承祖先test的级别,test也没设置,则继承根root的默认级别WARNING

    4.Handler使用

    Handler是个基类,不能直接实例化和使用,实际使用时候需要用它下面的不同子类方法

        4.1 作用:将对应level日志消息发送到handler指定的文件、网络、邮件等位置。

        4.2 Handler常用子类:

    logging.StreamHandler:把日志发送输出到对应stream中,如std.out/std.err/任何file-like对象

    参数:def __init__(self, stream=None)  stream未指定就是sys.stderr

        logging.FileHandler:将日志消息发送到文件,默认文件大小会无限增长

    参数:def __init__(self, filename, mode='a', encoding=None, delay=False)

        logging.handlers.RotatingFileHandler:将日志消息发送到文件,支持日志文件按大小切割

    参数:def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False)

        logging.hanlders.TimedRotatingFileHandler:将日志消息发送到文件,支持日志文件按时间切割

        logging.handlers.HTTPHandler:将日志消息以GET或POST的方式发送给一个HTTP服务器

        logging.handlers.SMTPHandler:将日志消息发送给一个指定的email地址

        logging.NullHandler:该Handler会忽略error messages

        说明:

      child logger子日志器处理完自己的日志消息后,会把消息传给它的祖先logger相关的handler,这样就不用给一个应用程序的所有logger创建并配置handler。只给顶层logger创建配置好handler就好了,后续就是按需要创建子日志器child logger就行了。如果要关闭这种父子继承关系,可以用logger的propagate属性设置为False来完成。​​​​​​​

import logginglogger=logging.getLogger('test')logger2=logging.getLogger('test.a') logger3=logging.getLogger('test.b') logger4=logging.getLogger('test.a.x')logger5=logging.getLogger('test.c')logger2.setLevel('DEBUG')logger4.setLevel('CRITICAL')logger5.setLevel('DEBUG')fileHandle=logging.FileHandler(filename='test1File.txt',mode='w',encoding='utf-8',delay=False)streamHandle=logging.StreamHandler()# rotingFileHandle=logging.handlers.RotatingFileHandler(filename='test2File.txt', 
                             mode='w', maxBytes=1000, backupCount=2, encoding='utf-8', delay=False)logger.addHandler(fileHandle)logger.addHandler(streamHandle)
logger.debug('这里是logger的 debug')logger2.info('这里是logger2的info')logger3.warning('这里是logger3的warning')logger4.error('这里是logger4的error')logger5.critical('这里是logger5的critical')

    输出:​​​​​​

这里是logger2的info这里是logger3的warning这里是logger5的critical

    从代码和输出分析可知:

    logger是根日志器,未设置level,级别为默认的warning,最后没有被输出;

    logger2设置level为DEBUG所以它的info信息被输出;

   logger3未设置level,则跟着上层级别test级别走则为默认的warning,而logger3的输出是warning级别所以被输出;

    logger4设置level=CRITICAL,而输出日志的error级别小于CRITICAL,所以未输出

    logger5设置level=DEBUG,而输出日志的critical级别大于DEBUG,所以被输出

    5.Formatter使用

        5.1 作用:设置日志的最终结构、顺序和内容格式,使用时可以直接实例化使用。

        5.2 参数含义:

        源码:def __init__(self, fmt=None, datefmt=None, style='%')

        fmt:日志内容格式化,未设置时默认使用message的原始值

        datafmt:日志内容时间格式,未设置时默认使用"%Y-%m-%d %H:%M:%S"

        style:日志内容格式化的字符,默认% 可以为 '%', '{'和 '$'

        5.3 使用

        未使用格式化前默认格式见4.2代码输出​​​​​​​

format=logging.Formatter(fmt=LOG_FORMAT, datefmt=dataTime_FORMAT,  style='%')logging.FileHandler().setFormatter(format)

代码示例:​​​​​​​

import logginglogger=logging.getLogger('test')logger2=logging.getLogger('test.a') #设置级别为ERRORlogger2.setLevel('DEBUG')fileHandle=logging.FileHandler(filename='test1File.txt',mode='w',encoding='utf-8',delay=False)streamHandle=logging.StreamHandler()LOG_FORMAT='%(asctime)s %(name)s %(filename)s %(funcName)s %(levelname)s \                %(message)s %(lineno)d %(levelno)s %(pathname)s %(process)s \                %(processName)s %(thread)s %(thread)s %(module)s %(created)f \                %(relativeCreated)d %(msecs)d'dataTime_FORMAT='%Y-%m-%d  %H:%M:%S %a 'format=logging.Formatter(fmt=LOG_FORMAT, datefmt=dataTime_FORMAT,  style='%')fileHandle.setFormatter(format)streamHandle.setFormatter(format)logger.addHandler(fileHandle)logger.addHandler(streamHandle)logger.debug('这里是logger的 debug')logger2.info('这里是logger2的info')

输出:

2019-10-12  16:32:03 Sat  test.a loggingStudy3.py <module> INFO                 这里是logger2的info 33 20 D:\gitProject\gitCsdn\pythonproject\loggingStudy\loggingStudy3.py 16876                 MainProcess 13908 13908 loggingStudy3 1570869123.999440                 1 999

 

总结:学到这里logging第二种方式的使用也就基本会用了,简单做下使用logging的流程总结:

1.增加logger :logger=logging.getLogger()

2.根据需要设置logger级别:logger.setLevel()

3.根据需要增加合适handler:filehandler=logging.FileHandle()

4.设置日志输出的格式:logging.Formatter()

5.给handler中添加设置的日志格式:filehandler.setFormatter()

6.把增加的handler添加到logger中:logger.addHandler(filehandler)

7.打印日志输出到文件或控制台中:logger.debug('')

8.结束,查看日志文件或控制台输出

 

 

 

 

#####欢迎大家加群交流####

QQ:464314378

微信群请先加群主微信,群主会拉各位小伙伴进群,注意添加备注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值