Handler实例用于将日志记录发送到指定的位置进行输出。一个logger对象可以添加多个handler(例如既要在控制台输出日志,又要将日志写入到文件A,还要讲日志写入文件B,这就可以配置3个handler),每个handler又可以定义不同日志级别,以实现日志分级过滤显示。常用的方法包括:
handler.setLevel():设置handler处理的日志信息最低级别
handler.setFormatter():为handler设置一个格式器对象
handler.addFilter():为handler添加一个过滤器对象
handler.removeFilter():为handler删除一个过滤器对象
要注意的是,在实际开发中,最好不要直接使用Handler类,应根据实际的功能需要,实例化Handler类的子类。Handler类的之类包括:
Handler 描述 logging.StreamHandler 将日志消息发送到输出到Stream,如std.out, std.err或任何file-like对象。 logging.FileHandler 将日志消息发送到磁盘文件,默认情况下文件大小会无限增长 logging.handlers.RotatingFileHandler 将日志消息发送到磁盘文件,并支持日志文件按大小切割 logging.hanlders.TimedRotatingFileHandler 将日志消息发送到磁盘文件,并支持日志文件按时间切割 logging.handlers.HTTPHandler 将日志消息以GET或POST的方式发送给一个HTTP服务器 logging.handlers.SMTPHandler 将日志消息发送给一个指定的email地址 logging.NullHandler 该Handler实例会忽略error messages,通常被想使用logging的library开发者使用来避免'No handlers could be found for logger XXX'信息的出现。
通过代码来演示一下,功能如下:在控制台输出日志(日志级别为debug),同时将日志写入到文件a.log文件(日志级别为debug),还要讲日志写入文件b.log文件(日志级别为warn):
import logging logger = logging.getLogger() logger.setLevel(logging.DEBUG) # 控制台输出 con_handler = logging.StreamHandler() con_handler.setLevel(logging.INFO) logger.addHandler(con_handler) # 输出到文件a.log file_a_handler = logging.FileHandler('./a.log', encoding='UTF-8') file_a_handler.setLevel(logging.DEBUG) logger.addHandler(file_a_handler) # 输出到文件b.log file_b_handler = logging.FileHandler('./b.log', encoding='UTF-8') file_b_handler.setLevel(logging.WARNING) logger.addHandler(file_b_handler) if __name__=='__main__': logger.debug('debug msg') logger.info('info msg') logger.warning('warn msg')
运行上面代码后,控制台输出如下:
info msg
warn msg
文件a.log会写入一下内容:
debug msg
info msg
warn msg
文件b.log会写入以下内容:
warn msg
注意:在一个日志器中添加多个handler时要注意,最好通过logger.setLevel(logging.DEBUG)先设置一下logger本身的日志级别,如果某个handler的级别比logger的日志级别低,那么该handler的日志级别无效,handler会以logger的级别来处理。
(3)格式器:Formatter
Formatter类实例用于配置日志记录的内容、结构等信息。可以通过以下三个参数进行配置:
fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值
datefmt:指定日期格式字符串,如果不指定该参数则默认使用"%Y-%m-%d %H:%M:%S"
style:指定格式化占位符,可取值为 '%', '{'和 '$',如果不指定该参数则默认使用'%'
fmt的使用方法可以参照上文中介绍过的logging.basicConfig函数format参数的配制方法。
例:每条日志输出日志时间、日制定及、所在模块名、函数名、行号等信息,并指定时间输出格式,最后把日志输出到控制台。代码如下: