Python 如何在Django中拦截对DB的所有读取查询?

Python 如何在Django中拦截对DB的所有读取查询?,python,django,signals,Python,Django,Signals,我需要截取对DB的所有查询,并将它们写入文件日志。 所以,如果像DELETE、UPDATE和CREATE这样的基本操作,我可以使用signals框架进行拦截。但是阅读查询呢?如何用信号捕捉它们?我认为django已经用它的日志框架实现了这一点。如果您想专门记录数据库查询。 您可以在设置中尝试以下操作 LOGGING = { 'handlers': { 'query': { 'level': 'DEBUG', 'class':

我需要截取对DB的所有查询,并将它们写入文件日志。
所以,如果像DELETE、UPDATE和CREATE这样的基本操作,我可以使用signals框架进行拦截。但是阅读查询呢?如何用信号捕捉它们?

我认为django已经用它的日志框架实现了这一点。如果您想专门记录数据库查询。 您可以在设置中尝试以下操作

LOGGING = {
    'handlers': {
        'query': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': 'logs/query.log',
            'formatter': 'verbose'
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['query'],
            'propagate': False,
            'level': 'DEBUG',
        },
    }
}

另一种方法是创建自定义中间件,并在其中处理查询

class SQLLoggingMiddleware(object):
    def process_request(self, request):
        from django.db import connection
        for query in connection.queries:
            #... do something with query

由于性能原因,SQL日志记录仅在Stutux.Debug被设置为true时启用,而不管安装的日志记录级别或处理程序。“这将杀死您的服务器。我不关心,这是一项任务。如果一个公司给出这样的任务,您可能会考虑替代性的就业。这类事情几乎不应该做,如果真的做了,应该在数据库级别。在理想的世界里编辑你的问题并标记你的数据库,伙计。但我有我所拥有的。