编辑
2023-09-19
测试平台
00
请注意,本文编写于 168 天前,最后修改于 168 天前,其中某些信息可能已经过时。

目录

1、用户故事
2、设计和实现
2.1 日志持久化
2.1.1 定义保存log的模型
2.2.2 自定义日志处理器
2.2.3 配置Django的logging设置
2.2 接口增加统一返回日志
3、总结

1、用户故事

在使用数据工厂时,只能看到配置的好的数据卡片;
但并不知道背后执行的逻辑是怎么样的,有时候执行的结果不符合预期时,
希望可以把当前数据卡片执行的日志返回,方便直接在前端就能排查问题。

image.png

2、设计和实现

2.1 日志持久化

2.1.1 定义保存log的模型

在某个app的models下面增加

python
# 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

python
# 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、总结

  • 日志存储需要依赖统一id,否则无法追踪
  • 目前写入日志是同步的,如果写入日志较大,会存在性能问题
  • 如果日志直接返回前端,存在安全性问题,敏感信息不要打到日志
  • 可增加日志查询接口,实现直接在前端查看日志

image.png

本文作者:花菜

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!