如何停止登录Django unittests从打印到stderr?

Nat*_*ate 5 python testing django logging

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

import logging
logger = logging.getLogger(__name__) # name is myapp.models
Run Code Online (Sandbox Code Playgroud)

然后我写入日志:

logger.debug("Here is my message")
Run Code Online (Sandbox Code Playgroud)

在我的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'
    },
},
Run Code Online (Sandbox Code Playgroud)

并试过这个:

'loggers': {
    'django': {
        'level': 'DEBUG',
        'handlers': ['null']
    },
    'myapp': {
        'handlers': ['logfile'],
        'level':'DEBUG',
    },
Run Code Online (Sandbox Code Playgroud)

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

Vin*_*jip 3

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

另一件要尝试的事情是:将所有顶级记录器(例如“django”,以及模块使用的记录器 - 例如“myapp”)的传播标志设置为 False。这会改变事情吗?

  • 啊哈!将 'propagate': False 添加到 myapp 的记录器就是诀窍。我尝试过这个,但将其错误地拼写为“propogate”,不出所料,这不起作用。谢谢! (2认同)