logging模块提供了两种记录日志的方式:
一种是使用logging提供的模块级别的函数;
另一种是使用logging的四大组件(Logger、Handler、Filter、Formatter)。
使用logging模块级别函数记录日志
logging.debug(msg, *args, **kwargs)
logging.info(msg, *args, **kwargs)
logging.warning(msg, *args, **kwargs)
logging.error(msg, *args, **kwargs)
logging.critical(msg, *args, **kwargs)
logging.log(level, *args, **kwargs)
logging.basicConfig(**kwargs)
其中,logging.basicConfig(**kwargs)
用于指定日志的级别、日志格式、日志输出的位置、日志文件的打开模式等。
import logging
logging.basicConfig(level=logging.DEBUG,
format='%(levelname)s: %(threadname)s: %(asctime)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%s', filename='example.log', filemode='w')
# filemode='w'表示清空example.log中的日志重新写入
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
logging.log(level=logging.INFO, 'info by log')
使用logging四大组件记录日志
logging的四大组件分别为:日志器Logger、处理器Handler、过滤器Filter和格式器Formatter,四者的关系为:
Logger需要通过Handler将日志信息输出到目标位置,如文件、sys.stdout、网络等;
Logger可以设置多个处理器将日志输出到不同的地方;
每个Handler都可以设置自己的过滤器实现日志过滤,从而只保留需要的日志;
每个Handler都可以设置自己的Formatter来设置不同的格式。
创建日志器
可以通过实例化Logger来创建一个日志器,也可以通过logging.getLogger()的方法来创建,一般推荐使用后者。logging.getLogger()方法有一个name参数,用于指定返回的日志器的名称,如果不指定的话默认为root。
myLogger = logging.getLogger('myLogger')
myLogger.setLevel(logging.DEBUG) # 设置Logger的日志等级
添加处理器
Logger对象可以通过addHandler(handler)方法为自己添加一个或多个处理器。那么Handler怎么创建呢?一般不建议直接实例化Handler类来创建,以下给出一些常用的handler:
Handler | 描述 |
---|---|
logging.StreamHandler | 将日志信息发送到stream, 如std.out、std.err或任何file-like对象 |
logging.FileHander | 将日志信息发送到磁盘文件,默认条件下文件大小会无限增长 |
logging.handlers.RotatingFileHandler | 将日志信息发送到磁盘文件,并将文件按大小切割 |
logging.handlers.TimeRotatingFileHander | 将日志信息发送到磁盘文件,并将文件按时间切割 |
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'信息的出现。 |
fileHandler = logging.handlers.TimeRotatingHandler(filename='example.log', when='d', interval=1, encoding='utf-8')
fileHandler.setLevel(logging.INFO) # 设置该handler的日志等级
myLogger.addHandler(fileHandler)
添加格式器
与Handler不同,Formatter可以通过直接实例化添加。Formatter的构造函数如下
logging.Formatter.__init__(fmt=None, datefmt=None, style='%')
该构造方法有三个可选参数:
· fmt:指定消息格式化字符串
· datefmt:指定时间的格式
· style:可取值为%、{、$,默认为%,此时fmt字符串的格式为%(
;如果取值{,则fmt字符串的格式为str.format()
;如果取值美元符号,则fmt字符串的格式为string.Template.substitute()
formatter = logging.Formatter('%(asctime)s %(thread)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%s')
fileHandler.setFormatter(formatter)
过滤器
Filter可以被Handler和Logger用来做比level更细粒度的、更复杂的过滤功能。Filter是一个过滤器基类,它只允许某个logger层级下的日志事件通过过滤。(没用过,以后再看...)