python logging模块学习

logging模块有以下四个概念

1.Loggers提供让应用程序代码直接使用的接口

2.Handlerslog record发送到适当的地方,log recordlogger创建

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指明,例如可以创建foofoo.barfoo.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应用这个loggerfilter,如果处理成功返回ture

Handlers

handler对象不能直接创建,必须使用内置类创建,例如StreamHandlerFileHandler

 Handler.setLevel(lvl),低于lvllogging消息将不会被记录

 Handler.addFilter(filt),给handler添加filter

Formatter

logging.Formatter(fmt=None, datefmt=None),创建一个Formatter对象,fmt是要转换的格式,datafmt是时间的格式。fmt的值参考LogRecord Attributes

Filter

可以被HandlersLoggers用来实施比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')


猜你喜欢

转载自blog.csdn.net/leonard_wang/article/details/54340687