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
都写到不同的文件中
回答:
答案是不可以
我来说一下原因:
- 首先明确一点,想要日志记录到不同文件,需要不同
logger
实例,请参考以下内容
输出不同的日志文件
日志的层级关系 然后再来看一下
django.db.backends
的logger实现,目录:django/db/backends/utils.py
import logging
...
logger = logging.getLogger('django.db.backends')
...
可以看到,日志的记录点只有一个
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},
)
- 所以,单个logger对象,单个记录点是不能实现文件拆分的
- 如果真有需求,可以看下源码,找到执行sql的点,用个装饰器或者来实现.或者重写
CursorWrapper
这个类
以上是 Django的ORM如何把不同APP的SQL日志写到不同的文件中? 的全部内容, 来源链接: utcz.com/p/938237.html