django - 即使 DEBUG=False 也记录 SQL 查询

标签 django logging python-logging

这是我在 settings.py 中的日志配置

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
        'file': {
            'class': 'logging.FileHandler',
            'filename': os.path.join(BASE_DIR, 'logs', 'django.log'),
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
        },
        'django.template': {
            'handlers': ['file', 'console'],
            'level': 'INFO',
        },
        'App': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
        },
    },
}

有一个我无法解释的行为:如果我使用 debug=True 运行,我可以看到所有 SQL 查询都记录到控制台,但是当 debug=False 即使我不更改上面的配置,也不会发生这种情况。

这是为什么?如何在我的日志记录配置中确定 SQL 查询是否记录到控制台?

最佳答案

随着 Django 根据计算属性的真实性包装数据库游标,查询日志记录变得更深入。

来自 Line 226, django.db.backends.base.base v2.2.6 sources

def _prepare_cursor(self, cursor):
    """
    Validate the connection is usable and perform database cursor wrapping.
    """
    self.validate_thread_sharing()
    if self.queries_logged:
        wrapped_cursor = self.make_debug_cursor(cursor)
    else:
        wrapped_cursor = self.make_cursor(cursor)
    return wrapped_cursor

此计算属性将决定在何处强制调试或在项目设置中启用调试

来自 Line 149, django.db.backends.base.base v2.2.6 sources

@property
def queries_logged(self):
    return self.force_debug_cursor or settings.DEBUG

您应该能够获得默认连接的代理并强制使用调试光标。

from django.db import connection

connection.force_debug_cursor = True

不过,我建议不要使用这种方法,而是支持在数据库中进行查询审计。

关于django - 即使 DEBUG=False 也记录 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58396629/

相关文章:

django - Django如何通过外键的值获取东西?

使用 NLog 进行 Azure 日志流式处理

tomcat - 桌面应用程序和 Tomcat Webapp 中的 log4j2.xml sys vs env

python-3.x - 如何在 python 的单独设置文件中配置颜色、格式等日志记录?

python - 如何获取当前的 python 日志记录配置?

django - 上下文处理器无法与 Django 中的 Jinja2 一起使用

ruby-on-rails - 将模型管理添加到 Active Admin - Rails 3

python - 如何使用 django AppConfig.ready()

java - 使用 log4j 将类日志记录到多个日志文件

python - 在 python 中登录到控制台时显示额外的字段