日志记录¶
当前 tortoise 有两个记录器,tortoise.db_client 和 tortoise。
tortoise.db_client 记录执行查询的信息,而 tortoise 记录运行时信息。
如果你想控制 tortoise 日志记录的行为,例如打印调试 sql,你可以自行配置,如下所示。
import logging
fmt = logging.Formatter(
fmt="%(asctime)s - %(name)s:%(lineno)d - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
sh = logging.StreamHandler(sys.stdout)
sh.setLevel(logging.DEBUG)
sh.setFormatter(fmt)
# will print debug sql
logger_db_client = logging.getLogger("tortoise.db_client")
logger_db_client.setLevel(logging.DEBUG)
logger_db_client.addHandler(sh)
logger_tortoise = logging.getLogger("tortoise")
logger_tortoise.setLevel(logging.DEBUG)
logger_tortoise.addHandler(sh)
你还可以使用自己的格式化程序,通过使用 pygments <https://pygments.pythonlang.cn/> 为 sql 添加语法着色。
import logging
from pygments import highlight
from pygments.formatters.terminal import TerminalFormatter
from pygments.lexers.sql import PostgresLexer
postgres = PostgresLexer()
terminal_formatter = TerminalFormatter()
class PygmentsFormatter(logging.Formatter):
def __init__(
self,
fmt="{asctime} - {name}:{lineno} - {levelname} - {message}",
datefmt="%H:%M:%S",
):
self.datefmt = datefmt
self.fmt = fmt
logging.Formatter.__init__(self, None, datefmt)
def format(self, record: logging.LogRecord):
"""Format the logging record with slq's syntax coloration."""
own_records = {
attr: val
for attr, val in record.__dict__.items()
if not attr.startswith("_")
}
message = record.getMessage()
name = record.name
asctime = self.formatTime(record, self.datefmt)
if name == "tortoise.db_client":
if (
record.levelname == "DEBUG"
and not message.startswith("Created connection pool")
and not message.startswith("Closed connection pool")
):
message = highlight(message, postgres, terminal_formatter).rstrip()
own_records.update(
{
"message": message,
"name": name,
"asctime": asctime,
}
)
return self.fmt.format(**own_records)
# Then replace the formatter above by the following one
fmt = PygmentsFormatter(
fmt="{asctime} - {name}:{lineno} - {levelname} - {message}",
datefmt="%Y-%m-%d %H:%M:%S",
)