Django的ORM如何把不同APP的SQL日志写到不同的文件中?

Django的ORM如何把不同APP的SQL日志写到不同的文件中?

目前的配置方式好像只能把所有的 sql 语句都写到一起是吗?

LOGGING = {

'version': 1,

'disable_existing_loggers': False,

'handlers': {

'console':{

'level':'DEBUG',

'class':'logging.StreamHandler',

},

},

'loggers': {

'django.db.backends': {

'handlers': ['console'],

'propagate': True,

'level':'DEBUG',

},

}

}

甚至更进一步,把 CRUD 的四种 sql 都写到不同的文件中


回答:

答案是不可以

我来说一下原因:

  1. 首先明确一点,想要日志记录到不同文件,需要不同logger实例,请参考以下内容
    输出不同的日志文件
    日志的层级关系
  2. 然后再来看一下django.db.backends的logger实现,目录:django/db/backends/utils.py

    import logging

    ...

    logger = logging.getLogger('django.db.backends')

    ...

  3. 可以看到,日志的记录点只有一个

    def debug_sql(self, sql=None, params=None, use_last_executed_query=False, many=False):

    start = time.monotonic()

    try:

    yield

    finally:

    stop = time.monotonic()

    duration = stop - start

    if use_last_executed_query:

    sql = self.db.ops.last_executed_query(self.cursor, sql, params)

    try:

    times = len(params) if many else ''

    except TypeError:

    # params could be an iterator.

    times = '?'

    self.db.queries_log.append({

    'sql': '%s times: %s' % (times, sql) if many else sql,

    'time': '%.3f' % duration,

    })

    logger.debug(

    '(%.3f) %s; args=%s',

    duration,

    sql,

    params,

    extra={'duration': duration, 'sql': sql, 'params': params},

    )

  4. 所以,单个logger对象,单个记录点是不能实现文件拆分的
  5. 如果真有需求,可以看下源码,找到执行sql的点,用个装饰器或者来实现.或者重写CursorWrapper这个类

以上是 Django的ORM如何把不同APP的SQL日志写到不同的文件中? 的全部内容, 来源链接: utcz.com/p/938237.html

回到顶部