Logging模块知识点:
一.分为5个级别:debug(),info(),warning(),error(),critical()。级别由低到高
1.1最简单的用法:
1.2 如果想把日志写到文件里:logging.basicConfig()方法
whw.log文件里的内容为:
注意后面那句level=’logging.INFO’的意思是把日志的记录级别设置为INFO,也就是说,只有日志是INFO或者比INFO级别高的日志才会被记录到文件里面。如上面的例子中debug的级别低于info所以whw.log日志文件里不会记录logging.debug()方法中的信息。如果希望记录debug的日志,只要将级别设置为DEBUG就可以了。
注意如果不设置日志级别,那么默认的日志级别是warning。
二.自定义日志格式
1.日志中增加时间信息:
whw.log文件中的内容为:(运行2次的结果)
除了加时间还可以定义一大堆格式,如下表所示:
三.日志同时输出到屏幕和文件
1.python使用logging模块记录日志涉及4个主要的类:
(1)logger:提供了应用程序可以直接使用的接口;
(2)handler:将(logger创建的)日志记录发送到合适的目的输出;
(3)filter:提供了细度设备来决定输出那条日志记录;(用的不多)
(4)formatter:决定日志记录的最终输出格式。
例一:同时输出到文件与屏幕(含filter过滤)
import logging class IgnoreBackupLogFilter(logging.Filter): """忽略带db backup 的日志""" def filter(self, record): #固定写法 return "db backup" not in record.getMessage() #1.生成logger对象############################################# whw_logger = logging.getLogger('whw_web') #设置日志级别(这里是全局的)全局的默认级别为warning whw_logger.setLevel(logging.DEBUG) #1.1 把filter对象添加到logger中就可以支持过滤 whw_logger.addFilter(IgnoreBackupLogFilter()) #注意,如果全局设置为DEBUG,console handler设置为INFO,如果输出日志级别为debug,那就不会在日志中打印 #全局先过滤一遍 #2.生成handler对象############################################## whw_co = logging.StreamHandler()#屏幕~~~ #可以在handler中设置级别:控制屏幕的不同的日志级别与输出 whw_co.setLevel(logging.WARNING) whw_fh = logging.FileHandler('whw_web.log')#文件~~~ #可以在handler中设置级别:控制文件的不同的日志级别与输出 whw_fh.setLevel(logging.ERROR) #2.1 把handler对象绑定到logger对象中 whw_logger.addHandler(whw_co) whw_logger.addHandler(whw_fh) #3.生成formatter对象############################################ #文件 file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #屏幕 console_formatter = logging.Formatter('%(asctime)s - %(name)s -%(lineno)s- %(levelname)s - %(message)s') #3.1 把formatter对象绑定到handler对象中 #屏幕+文件 whw_co.setFormatter(console_formatter) whw_fh.setFormatter(file_formatter) #########输出日志################################################# whw_logger.debug('whwhwhwhwh,db backup') whw_logger.info('whwhwhwhwh,db backup') whw_logger.warning('whwhwhwhwh,db backup') whw_logger.error('whwhwhwhwh')
例一的输出结果为:
例二:日志的自动截断
import logging from logging import handlers whw_logger = logging.getLogger(__name__) log_file = "whw_log.log" fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3) #也可:fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3) formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s') fh.setFormatter(formatter) whw_logger.addHandler(fh) whw_logger.warning('whehejwwj') whw_logger.warning('kjdswewi') whw_logger.error('wwhwwl')
例二的运行结果如下: