1、用户故事

在使用数据工厂时,只能看到配置的好的数据卡片;

但并不知道背后执行的逻辑是怎么样的,有时候执行的结果不符合预期时,

希望可以把当前数据卡片执行的日志返回,方便直接在前端就能排查问题。
image.png

2、设计和实现

2.1 日志持久化

2.1.1 定义保存 log 的模型

在某个 app 的 models 下面增加

# models.py
from django.db import models

class LogRecord(models.Model):
    class Meta:
        db_table = "t_log_record"
    request_id = models.CharField(max_length=100, null=True, db_index=True)
    level = models.CharField(max_length=20)
    message = models.TextField(db_index=True)    

2.2.2 自定义日志处理器

settings.py所在的目录,新建一个模块,比如log.py

# log.py

import logging
from xxx.models import LogRecord  # 引入上面定义的LogRecord模型

class DatabaseLogHandler(logging.Handler):
    def emit(self, record: logging.LogRecord) -> None:
        LogRecord.objects.create(
            request_id=record.request_id,
            level=record.levelname,
            message=self.format(record),
        )

2.2.3 配置 Django 的 logging 设置

注意,只是说明如何使用日志自定义 handle,不是完整的日志配置。

也缺少了上面的request_id字段,这个需要在 formatters 中配置。

使用request_id做链路追踪,参考:

https://blog.huacai.one/post/39

完整日志配置参考: https://github.com/lihuacai168/AnotherFasterRunner/pull/111/commits/2659df19192c41819813514aac5896d7550c1e5c

# settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'db': {
            'level': 'DEBUG',
            'class': 'your_app_name.handlers.DatabaseLogHandler',  # 指向你的自定义处理器
        },
    },
    'loggers': {
        'django': {
            'handlers': ['db'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}


2.2 接口增加统一返回日志

image.png
通过中间件返回,具体参考链接

https://github.com/lihuacai168/django-ninja-demo/blob/92b4f4250e9bb9d42628355698a3e7912cffb04d/core/middleware.py#L27C19-L27C19

3、总结

image.png

公众号原文


↙↙↙阅读原文可查看相关链接,并与作者交流