首页 > 代码库 > 高级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教程(译)