首页 > 代码库 > 高级Logger教程(译)
高级Logger教程(译)
这是之前闲来无事时翻译的,英文水平有限,翻译的不好还请轻拍。
logging库采用了一种模块化的组装,提供了几种不同类型的组件:loggers、handlers、filters、formatters。
* Loggers揭示了应用代码直接使用的接口
* Handlers将log记录(由Logger创建的)发送到合适的目的地
* Filters提供了出色的粒度的工具,这些工具决定使用哪些log记录输出
* Formatters指定最终输出的log记录的格式
Log事件信息在LogRecord实例中在loggers、handlers、filters和formatters之间传送。
Logging通过调用Logger类的实例方法执行。每个实例都有一个名字,从概念上在名称空间层次结构中进行排列,用点作为分隔符。举个例子,一个名叫scan的logger是loggers:‘scan.text‘、’scan.html‘、’scan.pdf‘的父辈。Logger名称可以任意选取,表明产生log信息的应用的区域。
比较好的为logger取名的惯例就是使用module-level logger,在使用logging的每个模块中,像下面这样取名:
logger = logging.getLogger(__name__)
这表明logger取名是根据package/module层次结构来的,而且从名称中就可以看出它是哪个模块里面的事件的logger。
这个层次结构的最顶端就是root,它的logger就叫root logger。要调用logger需要使用的方法:debug(), info(), warning(), error()和critical(),这些在root logger中使用就是本名。这些函数和方法都有相同的签名。root logger在输出信息中的名字就是“root”。
当然,log信息也是可以输出在不同的地方的。在将logger信息写入文件的包里面都支持这个功能,HTTP GET/POST处,使用SMTP的email,通用的sockets,或者定制操作系统的logging机制比如说syslog或者windows NT 事件log。目标地由handler类控制。如果你有特殊的需求,并且没有在任何内置的handler类里面的话,你也可以创建自定义的log目标地类。
默认情况下,不会为logging信息设定输出目标地。你可以设置basicConfig()指定一个目标地(比如控制台或者文件),这一块在初级教程中已经给出例子。如果你调用方法:debug(), info(), warning(), error()或critical(),他们就会检查是否已经设置了输出目的,如果没有设置过,在代理到 root logger将实际的信息输出之前,默认会将目标地设置成控制台(sys.stderr)输出,同时还会设定一个默认的格式。
basicConfig()默认的log信息格式为:
severity:logger name:message
这个格式也可以通过传给basicConfig()一个格式字符串到format这个关键字参数中。
Logging Flow
Log事件信息在loggers和handlers中的流程如下图展示:
Loggers
Logger对象有三方面的工作。第一,它暴露出几个方法给应用代码,这样,应用就能在运行中记录信息;第二,logger对象决定了哪些log信息是使用severity(默认的filter工具)或者filter对象去执行;第三,logger对象传送相关的log信息给那些对此感兴趣的log handler。
Logger对象使用最多的方法分为两类:confiuration 和 message sending。
下面这些是最常用的configuration方法:
* Logger.setLevel()
* Logger.addHandler()和Logger.removerHandler()
* Logger.addFilter()和Logger.removeFilter()
logger对象设置后,下面这些方法就能创建log信息了:
* Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical()
* Logger.exception()
* Logger.log()
Handlers
Handler对象的职责是分发合适的log信息到handler指定的目的地。
Filters
Formatter对象配置log信息最终的排序、结构和内容。
Configuring Logging
开发人员可以通过以下三种方式配置logging:
1. 用Python代码显式调用以上提到的配置方法创建loggers、handlers和formatters,
2. 建立一个logging配置文件,用fileConfig()方法读取
3. 创建一个配置信息字典,并把它传给dictConfig()方法
下面这个例子配置了一个非常简单的logger、一个控制台handler和一个简单的formatter:
import logging # create logger logger = logging.getLogger(‘simple_example‘) logger.setLevel(logging.DEBUG) # create console handler and set level to debug ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # create formatter formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘) # add formatter to ch ch.setFormatter(formatter) # add ch to logger logger.addHandler(ch) # ‘application‘ code logger.debug(‘debug message‘) logger.info(‘info message‘) logger.warn(‘warn message‘) logger.error(‘error message‘) logger.critical(‘critical message‘)
用控制行运行这个模块,就会有下面的输出:
$ python simple_logging_module.py 2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message 2005-03-19 15:10:26,620 - simple_example - INFO - info message 2005-03-19 15:10:26,695 - simple_example - WARNING - warn message 2005-03-19 15:10:26,697 - simple_example - ERROR - error message 2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message
高级Logger教程(译)