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

时间:2019-06-21 19:40:57

标签: python python-3.x unit-testing logging

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

  

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

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

import logging
logging.getLogger('foo').addHandler(logging.NullHandler())

因此,对于myapi.py之类的模块,我可能会有:

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

class MyApi: ...

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

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

class MyApiTests(unittest.TestCase): ...

我遇到的问题是,在运行单元测试时,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'

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

我一定很想念东西。谁能解释如何删除NullHandler或防止出现错误消息?

1 个答案:

答案 0 :(得分:1)

这是因为要在处理程序列表中添加类而不是实例。

log.addHandler(logging.NullHandler)

应该是

log.addHandler(logging.NullHandler())