前言
在自动化测试中,为了定位问题,调试框架代码,需要使用日志模块,今天我们重点讲解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")
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…..
|