日志的作用:
-调试程序
-了解系统程序运行情况,是否正常
-系统程序运行故障分析与问题定位
-用来做用户行为分析的数据统计
日志级别:是指日志信息的优先级、重要性或者严重程度
DEBUG:调试级别,打印非常详细的日志信息,通常用于对代码的调试
INFO:信息级别,打印一般的日志信息,突出强调程序的运行过程
WARNING:警告级别,打印警告日志信息,表现会出现潜在错误的情形,一般不影响软件的正常使用
ERROR:错误级别,打印错误异常信息,该级别错误可能会导致系统的一些功能无法正常使用
CRITICAL:严重错误级别,一个严重的错误,这表明系统可能无法继续运行
一般只搜索DEBUG、INFO、WARNING、ERROR四个日志级别步骤
1、导包
2、调用相应级别方法,记录日志
代码详解:
import logging# 设置日志级别
logging.basicConfig(level=logging.INFO)
# 打印日志信息
"""
设置日志级别后错误级别 ≥ INFO级别的才会被记录
"""
logging.debug("this is DEBUG...")
logging.info("this is INFO...")
logging.warning("this is WARNING...")
logging.error("this is ERROR...")
logging.critical("this is CRITICAL...")
编译结果:
INFO:root:this is INFO...
WARNING:root:this is WARNING...
ERROR:root:this is ERROR...
CRITICAL:root:this is CRITICAL...
设置日志级别
Logging.basicConfig(level=logging.DEBUG)
提示:
1、默认级别:logging.WARNING
2、设置级别时调用的是logging文件夹下面的常量,而不是调用的小写方法
3、设置级别后,日志信息只会记录大于或者等于此级别的记录
设置输出日志格式
fm = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"
设置日志输出到指定文件中
(三个参数:等级:level , 格式化:format ,输出文件:filename)
Logging.basceConfig(level = logging.DEBUG,format = fm,filename = "../log/log01.log")
执行代码:
import logging
"""
设置日志级别后错误级别 ≥ INFO级别的才会被记录
"""
# 设置log输出格式
fm = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"
# 设置日志级别,格式和输出位置
logging.basicConfig(level=logging.DEBUG,format = fm, filename= "./log/log01.log")# 打印日志信息
logging.debug("this is DEBUG...")
logging.info("this is INFO...")
logging.warning("this is WARNING...")
logging.error("this is ERROR...")
logging.critical("this is CRITICAL...")
Log01.log中的日志内容:
2021-06-29 22:35:00,146 DEBUG [root] [logging_level.py (<module>:9] - this is DEBUG...
2021-06-29 22:35:00,147 INFO [root] [logging_level.py (<module>:10] - this is INFO...
2021-06-29 22:35:00,147 WARNING [root] [logging_level.py (<module>:11] - this is WARNING...
2021-06-29 22:35:00,147 ERROR [root] [logging_level.py (<module>:12] - this is ERROR...
2021-06-29 22:35:00,147 CRITICAL [root] [logging_level.py (<module>:13] - this is CRITICAL...
日志的高级用法
logging的四大组件
Logger :日志器 - 提供了程序使用日志的入口
Handle : 处理器 - 将logger创建的日志记录发送到合适的目的输出
Formatter : 格式器 - 决定日志记录的最终输出格式
Filter : 提供了更细颗粒的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
注意:logging模块是通过这些组件来完成日志处理的
各组件之间的关系:
1、日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,如:文件、sys.std.out、网络等;
2、不同的处理器(handler)可以将日志输出到不同的位置;比如:控制台、文件、网络、邮件等。
3、日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置;
4、每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。
5、每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志; 简单点说就是:日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过 滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作。
日志器和处理器的使用
logger常用方法
如何创建logger对象
logger = logging.getLogger() - root
Logger = logging.getLogger(“mylogger”)
设置日志器将会处理的日志消息的最低严重级别
logger.setLevel()
为该logger对象添加一个handle对象
logger.addHandle()
如何创建Handle对象
logging.StreamHandler : 将日志消息发送到输出到Stream,如std.out;std.eer或任何file-like对象
logging.FileHandler:将日志消息发送到磁盘文件,默认情况下文件大小会无限增长
logging.handlers.RotatingFileHandler:将日志消息发送到磁盘文件,并支持日志文件按大小切割(了解)
logging.handlers.TimeRotatingHandler:将日志消息发送到磁盘文件,并支持日志文件按时间切割(掌握)
logging.handlers.HTTPHandler:将日志消息以GET或POST的方式发送给一个HTTP服务器
logging.handlers.SMTPHandler:将日志消息发送给一个指定的email地址
TimeRotatingHandler应用:
导包:import logging.handlers
实例化:th = logging.handlers.TimeRotatingHandler(filename = “文件路径”,
when = “时间单位”,
interval = “间隔时间”
backupcount = 备份日志数量)
when:时间单位
interval:时间间隔
backupcount:保留备份日志数量
Handler常用方法
设置handler将会处理的日志消息的最低严重级别
handler.setLevel()
设置格式器
handler.setFormatter()
日志器:
操作:
1、导包 import logging
2、调用方法获取logger对象 如:logging.getlogger()
3、设置级别:logger.setlevel = logging.INFO
4、调用添加处理器方法 logger.addHandler(处理器)
处理器:
获取:
1、sh = logging.StreamHandler()
扩展:设置处理器级别为error级别,那么只有error级别信息才会写入文件
格式器:
获取:
fmt = “%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s”
fm = logging.Formatter(fmt)
控制台处理器.setFormatter(fm)
文件处理器.setFormatter(fm)
应用:
logger.info(“日志信息”)
logger.error(“日志信息”)
日志封装
定义获取日志类
定义类属性 :logger = None
@classmethod
定义获取logger日志器的方法
if cls.logger is None:#判断logger是否为空,如果为空就执行以下操作
获取日志器对象
设置日志器级别
获取控制台处理器
获取文件处理器
获取格式器
将格式器添加到处理器中
将处理器添加到日志器中
return 类属性logger
注意:
1、以上条件无论是否成立,最后都会返回类属性logger;
2、当第一次调用时,条件一定成立,将类属性logger设置不为空
3、当第二次以上调用时,永远返回第一次设置的类属性对象
整体框架结构
单例模式操作日志,执行代码:
# 导包
import logging
import logging.handlers
# 创建日志类
class GetLogger():# 采用单例模式封装日志# 设置logger为Nonelogger = None
# 创建类方法@classmethoddef getLogger(cls):# 如果logger为None代码向下走,如果不是None则不执行代码,保证使用的是同一个loggerif cls.logger is None:# 实例化logger,创建日志器cls.logger = logging.getLogger()# 设置日志器的最低等级cls.logger.setLevel(logging.INFO)# 创建控制台处理器ls = logging.StreamHandler()# 创建文件处理器lht = logging.handlers.TimedRotatingFileHandler(filename = "../log/log01.log",when = "midnight",interval = 1,backupCount = 30)# 设置日志格式fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"# 获取日志格式器fm = logging.Formatter(fmt)# 将格式器添加到处理器中ls.setFormatter(fm)lht.setFormatter(fm)# 将处理器添加到日志器中cls.logger.addHandler(ls)cls.logger.addHandler(lht)# 返回日志器return cls.loggerif __name__ == "__main__":logger = GetLogger().getLogger()logger.info("info日志")
作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:开心螺蛳粉】自提!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群:1150305204,里面有各种测试开发资料和技术可以一起交流哦。