13.12 给函数库增加日志功能¶

问题¶

你想给�个函数库增加日志功能,但是��能影�到那些�使用日志功能的程�。

解决方案¶

对于想�执行日志�作的函数库而已,你应该创建一个专属的 logger 对象,并且�下�这样�始化�置:

# somelib.py

import logging
log = logging.getLogger(__name__)
log.addHandler(logging.NullHandler())

# Example function (for testing)
def func():
    log.critical('A Critical Error!')
    log.debug('A debug message')

使用这个�置,默认情况下�会打�日志。例如:

>>> import somelib
>>> somelib.func()
>>>

�过,如果�置过日志系统,那么日志消�打�就开始生效,例如:

>>> import logging
>>> logging.basicConfig()
>>> somelib.func()
CRITICAL:somelib:A Critical Error!
>>>

讨论¶

通常�讲,你�应该在函数库代�中自己�置日志系统,或者是已��定有个已�存在的日志�置了。

调用 getLogger(__name__) 创建一个和调用模���的logger模�。 由于模�都是唯一的,因此创建的logger也将是唯一的。

log.addHandler(logging.NullHandler()) �作将一个空处�器绑定到刚刚已�创建好的logger对象上。 一个空处�器默认会忽略调用所有的日志消�。 因此,如果使用该函数库的时候还没有�置日志,那么将�会有消�或警告出现。

还有一点就是对于�个函数库的日志�置�以是相互独立的,�影�其他库的日志�置。 例如,对于如下的代�:

>>> import logging
>>> logging.basicConfig(level=logging.ERROR)

>>> import somelib
>>> somelib.func()
CRITICAL:somelib:A Critical Error!

>>> # Change the logging level for 'somelib' only
>>> logging.getLogger('somelib').level=logging.DEBUG
>>> somelib.func()
CRITICAL:somelib:A Critical Error!
DEBUG:somelib:A debug message
>>>

在这里,根日志被�置�仅仅输出ERROR或更高级别的消�。 �过 ,somelib 的日志级别被�独�置��以输出debug级别的消�,它的优先级比全局�置高。 �这样更改�独模�的日志�置对于调试�讲是很方便的, 因为你无需去更改任何的全局日志�置——�需�修改你想�更多输出的模�的日志等级。

Logging HOWTO 详细介�了如何�置日志模�和其他有用技巧,�以�阅下。