我该如何禁用Django迁移调试日志记录?

9
非常类似于lafagundes关于南方迁移调试日志的问题,不同之处在于我没有使用south - 我正在使用纯Django 1.7迁移。我还使用django-nose测试运行器。
当我运行manage.py test时,没有捕获到调试日志输出:
(codesy)lcrouch:codesy lcrouch$ ./manage.py test
nosetests --verbosity=1
Creating test database for alias 'default'...
......E...............................
======================================================================
ERROR: test_return_state (auctions.tests.utils_tests.IssueStateTest)
----------------------------------------------------------------------

当我运行单个测试模块,例如./manage.py test auctions.tests.utils_tests时,调试日志输出包括涉及Django迁移的所有django.db.backends.schema: DEBUG行:
(codesy)lcrouch:codesy lcrouch$ ./manage.py test auctions.tests.utils_tests
nosetests auctions.tests.utils_tests --verbosity=1
Creating test database for alias 'default'...
E
======================================================================
ERROR: test_return_state (auctions.tests.utils_tests.IssueStateTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/lcrouch/code/codesy/codesy/auctions/tests/utils_tests.py", line 13, in test_return_state
    fake_gh_client = fudge.Fake(github_client).returns_fake().provides('get_repo').returns_fake().provides('get_issue').returns_fake().has_attr(state='open')
  File "/Users/lcrouch/python/codesy/lib/python2.7/site-packages/fudge/__init__.py", line 1133, in returns_fake
    exp = self._get_current_call()
  File "/Users/lcrouch/python/codesy/lib/python2.7/site-packages/fudge/__init__.py", line 765, in _get_current_call
    "Call to a method that expects a predefined call but no such call exists.  "
FakeDeclarationError: Call to a method that expects a predefined call but no such call exists.  Maybe you forgot expects('method') or provides('method') ?
-------------------- >> begin captured logging << --------------------
django.db.backends.schema: DEBUG: CREATE TABLE "django_migrations" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "app" varchar(255) NOT NULL, "name" varchar(255) NOT NULL, "applied" datetime NOT NULL); (params [])
django.db.backends.schema: DEBUG: CREATE TABLE "django_content_type" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(100) NOT NULL, "app_label" varchar(100) NOT NULL, "model" varchar(100) NOT NULL); (params [])
django.db.backends.schema: DEBUG: CREATE TABLE "django_content_type__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(100) NOT NULL, "app_label" varchar(100) NOT NULL, "model" varchar(100) NOT NULL, UNIQUE ("app_label", "model")); (params [])
...
django.db.backends.schema: DEBUG: DROP TABLE "socialaccount_socialapp"; (params [])
django.db.backends.schema: DEBUG: ALTER TABLE "socialaccount_socialapp__new" RENAME TO "socialaccount_socialapp"; (params [])

这使得重新回到实际失败变得非常困难。

我该如何禁用此输出?无论是在Django还是nose级别上?

2个回答

4
如果您不介意在测试中禁用迁移,可以通过将以下内容添加到您的settings.py来实现:
TESTING = 'test' in sys.argv

if TESTING:
    class DisableMigrations(object):
        def __contains__(self, item):
            return True

        def __getitem__(self, item):
            return "notmigrations"

    MIGRATION_MODULES = DisableMigrations() 

这将一次性创建数据库,而不是逐步执行每个迁移。

如果您希望在测试中保持迁移运行,则可以通过更新日志设置来删除消息。

TESTING = 'test' in sys.argv

if TESTING:
    LOGGING = {
        'version': 1,
        'handlers': {
            'file': {
                'level': 'DEBUG',
                'class': 'logging.FileHandler',
                'filename': '/tmp/codesy-debug.log',
            },
        },
        'loggers': {
            'django.db.backends.schema': {
                'handlers': ['file'],
                'propagate': True,
                'level': 'INFO',
            },
            '': {
                'handlers': ['file'],
                'level': 'DEBUG',
            }
        }
    }

2
谢谢,LOGGING配置方法更好。但似乎这应该是Django本身的一个选项? - groovecoder
我还对 “LOGGING” 设置进行了微调,具体来说,我只是将“handlers”设置为“['console']”,并将“level”设置为“'WARNING'”。 - Armando Pérez Marqués
Django 2.0,第一个例子:ModuleNotFoundError: No module named 'notmigrations' - ncopiy

2
为了快速删除日志消息,您可以运行以下命令:./manage.py test --nologcapture 这些消息是由 nose logcapture 插件 捕获的,该插件还有其他微调选项。然而,django-nose 存在一个 旧问题 可能会阻止您从命令行使用其中许多选项。它被计划在 v1.4.2 里程碑 中,但已经过期一个月了。您可以通过 .nosercnose.cfg 文件解决这些问题 - 有关格式,请参见 nose 文档

那个很快,但我想捕获其他日志输出。我只是不想要“DEBUG”级别的输出。 - groovecoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接