logging模块有以下四个概念
1.Loggers提供让应用程序代码直接使用的接口
2.Handlers把log record发送到适当的地方,log record由logger创建
3.Filters提供一个细粒度的控制,用来决定输出哪些log record
4.Formatters决定了log record最终的输出格式
logging模块的特点
1.是线程安全的
2.logger之间是层级、继承关系
3.logger之间的层次关系作用于程序的全局范围内
Loggers
logger不能直接创建,必须调用logging.getLogger(name)
一个应用程序内的logger之间存在层次关系,由一个root logger,其他的logger都是从root logger继承而来。这种继承关系可以在调用logging.getLogger(name)的时候,通过name指明,例如可以创建foo,foo.bar,foo.bar.baz三个logger。
logger有自己的severity level,通过logger.setLevel()设置,创建logger的时候默认是0。
logger.debug(),logger.info(),logger.warning(),logger.error(),logger.critical()可以记录不同级别的日志。
Logger.addFilter(filt),给logger添加一个fileter
Logger.addHandler(hdlr),给logger添加一个handler
Logger.filter(record),对一个record应用这个logger的filter,如果处理成功返回ture
Handlers
handler对象不能直接创建,必须使用内置类创建,例如StreamHandler,FileHandler。
Handler.setLevel(lvl),低于lvl的logging消息将不会被记录
Handler.addFilter(filt),给handler添加filter
Formatter
logging.Formatter(fmt=None, datefmt=None),创建一个Formatter对象,fmt是要转换的格式,datafmt是时间的格式。fmt的值参考LogRecord Attributes。
Filter
可以被Handlers和Loggers用来实施比level更为复杂的控制。
Filters可以更改传递给它们的logrecord,例如增加一些属性,或按照Formatter格式输出。
基础Filter class只允许在logger层级中某一点之下的event通过。例如,一个filter类以‘A.B’初始化,会允许被这些logger记录的事件通过:‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’,但是不允许‘A.BB’, ‘B.A.B’。如果是以空字符初始化,那么所有的event都能通过。
使用logging.Filter(name='')实例化一个filter对象。
下面是一个在程序里面使用两个logger分别记录日志到不同输出的例子
import logging logger = logging.getLogger('simple_example') logger.setLevel(logging.DEBUG) # create file handler which logs even debug messages fh = logging.FileHandler('spam.log') fh.setLevel(logging.DEBUG) # create console handler with a higher log level ch = logging.StreamHandler() ch.setLevel(logging.ERROR) # create formatter and add it to the handlers formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') ch.setFormatter(formatter) fh.setFormatter(formatter) # add the handlers to logger logger.addHandler(ch) logger.addHandler(fh) # 'application' code logger.debug('debug message') logger.info('info message') logger.warn('warn message') logger.error('error message') logger.critical('critical message')