Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在单元测试中设置Python日志_Python_Unit Testing_Logging_Python Unittest_Nose - Fatal编程技术网

如何在单元测试中设置Python日志

如何在单元测试中设置Python日志,python,unit-testing,logging,python-unittest,nose,Python,Unit Testing,Logging,Python Unittest,Nose,如何在Python包和支持的单元测试中设置日志记录,以便在出现问题时可以查看日志文件 当前,包日志记录似乎被nose/unittest捕获,如果测试失败,则会被抛出控制台;只有单元测试日志才能将其记录到文件中 在package和unit test源文件中,我目前正在使用以下工具获取一个记录器: import logging import package_under_test log = logging.getLogger(__name__) 在单元测试脚本中,我一直在尝试使用基本FileHa

如何在Python包和支持的单元测试中设置日志记录,以便在出现问题时可以查看日志文件

当前,包日志记录似乎被nose/unittest捕获,如果测试失败,则会被抛出控制台;只有单元测试日志才能将其记录到文件中

在package和unit test源文件中,我目前正在使用以下工具获取一个记录器:

import logging
import package_under_test

log = logging.getLogger(__name__)
在单元测试脚本中,我一直在尝试使用基本FileHandler设置日志处理程序,可以直接在线设置,也可以通过setUp()/setUpClass()TestCase方法设置

以及当前在单元测试脚本setUp()方法中设置的日志配置


最后一行中的日志确实会在文件中结束,但此配置显然不会过滤回正在测试的导入包。

日志对象在层次结构中运行,日志消息会“冒泡”到层次结构链中,并传递给沿途的任何处理程序(前提是消息的日志级别等于或超过您正在登录的记录器对象的最小阈值)。忽略筛选和全局日志级别配置,在伪代码中会发生以下情况:

if record.level < current_logger.level:
    return
for logger_object in (current_logger + current_logger.parents_reversed):
    for handler in logger_object.handlers:
        if record.level >= handler.level:
            handler.handle(record)
    if not logger_object.propagate:
        # propagation disabled, the buck stops here.
        break
然后,只有
test1
test2
中的日志对象才会看到相同的处理程序

您可以使用
logging.root
logger.getLogger()
(无名称参数或名称设置为
None
)将日志记录器移动到根日志记录器。所有日志记录器都是根日志记录器的子节点,只要它们没有设置为
False
,日志消息就会到达根处理程序

其他选项是使用
logging.getLogger('acme')
显式获取
acme
记录器对象,或者在整个代码中始终使用一个显式记录器名称,该名称在测试和库中相同


一定要考虑到这个问题。

如果没有更具体的例子,这很难回答。例如,我们不知道您是如何配置日志记录的。登录包源和单元测试源都使用:#import logging log=logging.getLogger(name)是的,但您没有设置任何配置?
logging.basicConfig()
或显式配置集?抱歉-我会将配置添加到问题中-格式在注释中丢失。该片段中的
log
是什么?完美-感谢所有人的帮助和您的耐心,因为我正确地表述了问题。完成-我甚至不知道有接受-所以感谢您指出这一点。我应该这样做等我有空的时候再回头看看我的其他问题。@PaulDSmith:很高兴我能跳出来问你!:-)记住,接受从来都不是强制性的,完全是你的选择。您最多只能将问题的一个答案标记为已接受。
if record.level < current_logger.level:
    return
for logger_object in (current_logger + current_logger.parents_reversed):
    for handler in logger_object.handlers:
        if record.level >= handler.level:
            handler.handle(record)
    if not logger_object.propagate:
        # propagation disabled, the buck stops here.
        break
- acme
    - frobnars
    - tests
        # logger object
        - test1
        - test2
    - widgets