如何阻止Django单元测试的日志输出到stderr?

6 投票
1 回答
1482 浏览
提问于 2025-04-17 09:53

我正在用标准的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的命令行界面时,我能看到那些日志信息。

但是,当我运行我的测试套件时,测试套件的控制台能看到所有这些信息。它使用了一个我没有明确定义的不同格式化器,并且输出到标准错误(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',
    },

...但是日志记录和标准错误输出的行为还是一样。就好像在我运行测试时又多了一个日志处理器。

1 个回答

3

从你的配置片段来看,不太清楚根日志记录器(root logger)有没有配置任何处理器(handlers)。我还假设你在使用Django 1.3。你能调查一下在运行测试时,根日志记录器上添加了哪些处理器吗?据我所知,Django并不会自动添加任何东西,也许是你引入的某些代码在不经意间调用了basicConfig。你可以用类似ack-grep的工具查找一下fileConfig、dictConfig、basicConfig和addHandler这些词,看看有没有哪个在给根日志记录器添加处理器。

另一个可以尝试的办法是:把所有顶级日志记录器(比如“django”,还有你自己模块用的,比如“myapp”)的propagate标志设置为False。这样做会有什么变化吗?

撰写回答