Python|将日志记录添加到Python库
在本文中,我们将学习如何向库中添加日志记录功能,但不希望它干扰不使用日志记录的程序。
对于想要执行日志记录的库,创建一个专用的记录器对象,并按照下面的代码进行初始配置——
代码#1:
# abc.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
abc.func()
输出 :
NO OUTPUT
如果日志系统得到配置,日志消息将开始出现。
代码#2:
import logging
logging.basicConfig()
somelib.func()
输出 :
CRITICAL:somelib:A Critical Error!
它是如何工作的 ?
- 库对日志记录提出了一个特殊的问题,因为关于它们使用的环境的信息是未知的。
- 作为一般规则,永远不要编写试图自行配置日志系统或对已经存在的日志配置进行假设的库代码。
- 因此,需要非常小心地提供隔离。
- 对
getLogger(__name__)
的调用会创建一个与调用模块同名的记录器模块。 - 由于所有模块都是唯一的,因此这会创建一个可能与其他记录器分开的专用记录器。
-
log.addHandler(logging.NullHandler())
操作将一个空处理程序附加到刚刚创建的记录器对象。默认情况下,null 处理程序会忽略所有日志记录消息。 - 因此,如果使用该库并且从未配置日志记录,则不会出现任何消息或警告。
可以独立配置各个库的日志记录,而不管其他日志记录设置如何,如下面给出的代码所示 -
代码#3:
import logging
logging.basicConfig(level = logging.ERROR)
import abc
print (abc.func())
Change the logging level for 'abc' only
logging.getLogger('abc').level = logging.DEBUG
print (abc.func())
输出 :
CRITICAL:abc:A Critical Error!
DEBUG:abc:A debug message