Python logging模块原理解析及应用
一、logging日志模块等级
常见log级别从高到低:
CRITICAL》ERROR》WARNING》INFO》DEBUG,默认等级为WARNING,即>=WARNING级别的log才输出。
日志等级(level)
描述
CRITICAL
当发生严重错误,导致应用程序不能继续运行时记录的信息
ERROR
由于一个更严重的问题导致某些功能不能正常运行时记录的信息
WARNING
当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
INFO
信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
DEBUG
最详细的日志信息,典型应用场景是问题诊断
二、logging模块的使用方式介绍
logging模块提供了两种记录日志的方式:
- 第一种方式是使用logging提供的模块级别的函数
- 第二种方式是使用Logging日志系统的四大组件
其实,logging所提供的模块级别的日志记录函数也是对logging日志系统相关类的封装而已。
(1)logging模块定义的模块级别的常用函数
函数 | 说明 |
---|---|
logging.debug(msg,*args,**kwargs) | 创建一条严重级别为DEBUG的日志记录 |
logging.info(msg,*args,**kwargs) | 创建一条严重级别为INFO的日志记录 |
logging.warning(msg,*args,**kwargs) | 创建一条严重级别为WARNING的日志记录 |
logging.error(msg,*args,**kwargs) | 创建一条严重级别为ERROR的日志记录 |
logging.critical(msg,*args,**kwargs) | 创建一条严重级别为CRITICAL的日志记录 |
logging.log(level,*args,**kwargs) | 创建一条严重级别为level的日志记录 |
logging.basicConfig(**kwargs) | 对rootlogger进行一次性配置 |
其中logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。
(2)logging模块的四大组件
组件 | 说明 |
---|---|
loggers | 提供应用程序代码直接使用的接口 |
handlers | 用于将日志记录发送到指定的目的位置 |
filters | 提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略) |
formatters | 用于控制日志信息的最终输出格式 |
三、自定义Logger模块类
#testLog1.py importlogging importtime classLogger(): def__init__(self,logger,level=logging.DEBUG): ''':自定义Logger模块类 :logger:logger名 :level:日志级别 ''' #创建一个logger self.logger=logging.getLogger(logger) self.logger.setLevel(level) #定义handler的输出格式 curr_time=time.strftime("%Y-%m-%d") self.LogFileName='log'+curr_time+'.txt' fmt=logging.Formatter('%(asctime)s-%(filename)s:[%(lineno)s]-[%(levelname)s]-%(message)s') #asctime:日志事件发生的时间 #filename:源文件的名称部分,包含文件后缀 #lineno:调用日志记录函数的源代码所在的行号 #evelname:该日志记录的文字形式的日志级别 #message:日志记录的文本内容 #创建一个handler,用于写入日志文件 fh=logging.FileHandler(self.LogFileName) fh.setLevel(logging.DEBUG) fh.setFormatter(fmt) #再创建一个handler,用于输出到控制台 ch=logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(fmt) #给logger添加handler self.logger.addHandler(fh) self.logger.addHandler(ch) #level优先级 #logger.setLevel>handler.setLevel>logging.basicConfig if__name__=="__main__": log=Logger(__name__,level=logging.DEBUG) log.logger.debug('debug') log.logger.log(logging.DEBUG,'debug')#执行testLog1.py,则控制台输出如下:2020-08-0320:36:47,104-testLog1.py:[117]-[DEBUG]-debug2020-08-0320:36:47,104-testLog1.py:[118]-[DEBUG]-debug#日志文件记录如下:2020-08-0320:36:15,982-testLog1.py:[117]-[DEBUG]-debug2020-08-0320:36:15,982-testLog1.py:[118]-[DEBUG]-debug
#testLog2.py fromtestLog1importLogger importtraceback log=Logger(__name__) deffunc(): try: assert1==2 exceptException: log.logger.info('测试失败,输出信息如下:{}'.format(traceback.format_exc()))#traceback.format_exc()会返回异常信息的字符串 if__name__=="__main__": func()#执行testLog2.py,则控制台输出如下:2020-08-0320:43:44,907-testLog2.py:[11]-[INFO]-测试失败,输出信息如下:Traceback(mostrecentcalllast): File"E:/imooc/testLog.py",line9,infunc assert1==2AssertionError#日志文件记录如下:2020-08-0320:43:44,907-testLog2.py:[11]-[INFO]-测试失败,输出信息如下:Traceback(mostrecentcalllast): File"E:/imooc/testLog.py",line9,infunc assert1==2AssertionError
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。