如何阻止Django单元测试的日志输出到stderr?
我正在用标准的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 个回答
从你的配置片段来看,不太清楚根日志记录器(root logger)有没有配置任何处理器(handlers)。我还假设你在使用Django 1.3。你能调查一下在运行测试时,根日志记录器上添加了哪些处理器吗?据我所知,Django并不会自动添加任何东西,也许是你引入的某些代码在不经意间调用了basicConfig。你可以用类似ack-grep的工具查找一下fileConfig、dictConfig、basicConfig和addHandler这些词,看看有没有哪个在给根日志记录器添加处理器。
另一个可以尝试的办法是:把所有顶级日志记录器(比如“django”,还有你自己模块用的,比如“myapp”)的propagate标志设置为False。这样做会有什么变化吗?