在保持settings.DEBUG的同时关闭SQL日志记录?

kdt*_*kdt 26 sql django logging

当settings.DEBUG = True时,Django将SQL操作记录到内部缓冲区(无论是否记录到文件).因为我有长时间运行的进程来执行大量的数据库操作,所以这会导致程序的开发模式实例在内存消耗中迅速增长.

我想禁用内部SQL日志记录机制,同时保留settings.DEBUG开启我的开发:这可能吗?

Django版本1.3.0.

Rei*_*ees 42

是的,您可以通过为名为'django.db.backends'的记录器分配'null handler'来安静sql记录.我假设你使用django的新的基于dict的日志设置?如果是这样,这个片段应该很容易:

    ...
    'handlers': {
        'null': {
            'level': 'DEBUG',
            'class':'logging.NullHandler',
            },
    ...
    'loggers': {
        ... your regular logger 'root' or '' ....
        'django.db.backends': {
            'handlers': ['null'],  # Quiet by default!
            'propagate': False,
            'level':'DEBUG',
            },
    ...
Run Code Online (Sandbox Code Playgroud)

更新:看看Brian的回答.我理解"日志记录"是指每个sql语句的恼人记录.Brian谈到每个查询的内部内存记录(我猜他是对的:-)

  • 在Django> = 1.9的版本中,`django.utils.log.NullHandler`不再存在.请改用`logging.NullHandler`. (2认同)

Bri*_*ket 24

当settings.DEBUG为True时,Django使用CursorDebugWrapper而不是CursorWrapper.这是将查询附加到connection.queries并消耗内存的原因.我会修补连接包装器以始终使用CursorWrapper:

from django.conf import settings
from django.db.backends import BaseDatabaseWrapper
from django.db.backends.util import CursorWrapper

if settings.DEBUG:
    BaseDatabaseWrapper.make_debug_cursor = lambda self, cursor: CursorWrapper(cursor, self)
Run Code Online (Sandbox Code Playgroud)

像其他人一样禁用日志记录建议无法解决问题,因为即使日志已关闭,CursorDebugWrapper仍会将查询存储在connection.queries中.

  • 这是怎么回事?如果我将它添加到settings.py我得到以下`ImportError:无法导入设置,因为环境变量DJANGO_SETTINGS_MODULE未定义.当尝试执行`来自django.db.backends import BaseDatabaseWrapper`. (11认同)
  • 在 Django 的最新版本中,导入路径已更改:“from django.db.backends.base.base import BaseDatabaseWrapper”和“from django.db.backends.utils import CursorWrapper” (2认同)

dus*_*san 5

这对我有用(至少对于 Django 1.3.1):

from django.db import connection
connection.use_debug_cursor = False
Run Code Online (Sandbox Code Playgroud)

我发现变量检查 Django 源代码(没有记录),相关行可以在django/db/backends/__init__.pyBaseDatabaseWrapper类)中找到:

def cursor(self):
    if (self.use_debug_cursor or
        (self.use_debug_cursor is None and settings.DEBUG)):
        cursor = self.make_debug_cursor(self._cursor())
    else:
        cursor = util.CursorWrapper(self._cursor(), self)
    return cursor
Run Code Online (Sandbox Code Playgroud)