【问题标题】:Python library default NullHandler causing error when unit testingPython库默认NullHandler在单元测试时导致错误
【发布时间】:2019-11-04 15:56:25
【问题描述】:

我正在尝试为我正在编写的 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.setLevel(logging.DEBUG)。我仍然得到错误。

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

【问题讨论】:

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


    【解决方案1】:

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

    log.addHandler(logging.NullHandler)
    

    应该是

    log.addHandler(logging.NullHandler())
    

    【讨论】:

      猜你喜欢
      • 2019-05-02
      • 2012-11-21
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多