Python 库默认 NullHandler 在单元测试时导致错误

jjw*_*ign 3 python logging unit-testing python-3.x

我正在尝试为我正在编写的 api 库设置默认记录器。Python 文档规定在库中设置 NullHandler,然后让使用该库的开发人员确定应如何处理日志记录。

注意 强烈建议您不要向库的记录器添加 NullHandler 以外的任何处理程序。这是因为处理程序的配置是使用您的库的应用程序开发人员的特权。应用程序开发人员知道他们的目标受众以及哪些处理程序最适合他们的应用程序:如果您在“幕后”添加处理程序,您很可能会干扰他们执行单元测试和交付符合他们要求的日志的能力。

https://docs.python.org/3/howto/logging.html#logging-advanced-tutorial

import logging
logging.getLogger('foo').addHandler(logging.NullHandler())
Run Code Online (Sandbox Code Playgroud)

所以,对于像 myapi.py 这样的模块,我可能有:

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

class MyApi: ...
Run Code Online (Sandbox Code Playgroud)

然后在单元测试文件中,我将设置实际的日志处理程序。

import logging
log = logging.getLogger('myapi')
log.handlers = []
log.addHandler(logging.StreamHandler(sys.stdout))
log.setLevel(logging.DEBUG)

class MyApiTests(unittest.TestCase): ...
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是 NullHandler 在运行单元测试时会导致出现错误消息。

  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 1590, in callHandlers
  if record.levelno >= hdlr.level:
  AttributeError: type object 'NullHandler' has no attribute 'level'
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几种方法来消除错误。首先,我尝试删除现有的处理程序;log.handlers = []。那似乎没有任何改变。我还尝试设置日志级别;log.setLevel(logging.DEBUG)。我仍然收到错误。

我肯定错过了什么。谁能解释如何删除 NullHandler 或防止错误消息?

hoe*_*ing 7

这是因为您将类而不是实例添加到处理程序列表中。

log.addHandler(logging.NullHandler)
Run Code Online (Sandbox Code Playgroud)

应该

log.addHandler(logging.NullHandler())
Run Code Online (Sandbox Code Playgroud)