python - 如何停止从打印到 stderr 的 Django 单元测试记录?

标签 python django testing logging

我正在使用 bog-standerd django.test.Testcase 测试一些 Django 模型。我的 models.py 使用以下初始化代码写入调试日志:

import logging
logger = logging.getLogger(__name__) # name is myapp.models

然后我写日志:

logger.debug("Here is my message")

在我的 settings.py 中,我设置了一个 FileHandler 和一个用于 myapp 的记录器,使用该处理程序且仅使用该处理程序。这很棒。我看到该日志的消息。当我在 Django shell 中时,我看到该日志的消息。

但是,当我运行我的测试套件时,我的测试套件控制台会看到所有这些消息。它使用我没有明确定义的不同格式化程序,并且正在写入 stderr。我没有定义写入 stderr 的日志处理程序。

我真的不希望这些消息向我的控制台发送垃圾邮件。如果我想查看这些消息,我将跟踪我的日志文件。有办法让它停止吗? (是的,我可以重定向 stderr,但有用的输出也会转到 stderr。)

编辑:我在 settings.py 中设置了两个处理程序:

'handlers': {
    'null': {
        'level': 'DEBUG',
        'class': 'django.utils.log.NullHandler',
    },
    'logfile' : {
        'level':'DEBUG',
        'class':'logging.FileHandler',
        'filename':'%s/log/development.log' % PROJECT_DIR,
        'formatter': 'simple'
    },
},

并尝试了这个:

'loggers': {
    'django': {
        'level': 'DEBUG',
        'handlers': ['null']
    },
    'myapp': {
        'handlers': ['logfile'],
        'level':'DEBUG',
    },

...但是日志记录/stderr 转储行为保持不变。这就像我在运行测试时得到另一个日志处理程序。

最佳答案

从您的配置片段中不清楚为根记录器配置了哪些处理程序(如果有的话)。 (我还假设您使用的是 Django 1.3。)您能否调查并告诉我们在运行测试时已将哪些处理程序添加到根记录器? AFAICT Django 没有添加任何东西——也许您正在导入的某些代码在您没有意识到的情况下调用了 basicConfig。使用类似 ack-grep 的东西来查找 fileConfig、dictConfig、basicConfig 和 addHandler 的任何出现 - 所有这些都可能向根记录器添加处理程序。

另一件事要尝试:将所有顶级记录器的传播标志设置为 False(比如“django”,还有那些被你的模块使用的 - 比如“myapp”)。这会改变一切吗?

关于python - 如何停止从打印到 stderr 的 Django 单元测试记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8794768/

相关文章:

python - textblob 教程中的 UnicodeDecodeError

python - 如何要求 STUN 服务器使用 aiortc 生成 ice candidates?

Django 表单向导保存并转到上一步

python - 在 django.test.client 中保留 session ID

ruby-on-rails - 如何执行 "just commit after test"

python - 使用 savefig 在 matplotlib.pyplot 中增加每英寸点数 (DPI)

python - 如何在matplotlib条形图后面绘制网格线

django - 如何排除 Django 循环中的项目?

Django 1.4 - {{ request.user.username}} 不在模板中呈现

testing - 从普通的 Groovy 迁移到 Gradle