测试基础 Django 增加链路追踪 trace_id

花菜 · 2023年08月20日 · 最后由 迷龙 回复于 2023年08月22日 · 3963 次阅读

1、背景

在日常开发中,日志是问题排查最为常见的手段。

那么怎么样配置日志,才能快速的筛选出来想要的信息呢?

这个时候,需要引入 trace_id 的概念了。

在每一行日志增加 trace_id 作为标识符,筛选的时候,只需要通过 trace_id 来过滤,就能快速筛选出来需要的信息。

2、Django 增加 trace_id

2.1 安装依赖

# 我使用的Django版本是2.2
pip install django-log-request-id~=2.0.0

Github 地址 https://github.com/dabapps/django-log-request-id

2.2 配置

配置字段有点多,耐心点看完哦

# settings.py

# 中间件配置
MIDDLEWARE = [
    "log_request_id.middleware.RequestIDMiddleware", # 放在列表的第一个
         ...
]

# 按照库的文档配置就好,或者直接照抄
LOG_REQUEST_ID_HEADER = "HTTP_X_REQUEST_ID"
GENERATE_REQUEST_ID_IF_NOT_IN_HEADER = True
REQUEST_ID_RESPONSE_HEADER = "TRACE-ID"

# 日志配置
    "formatters": {
        "color": {
            "()": "colorlog.ColoredFormatter",
          # 日志格式,重点是%(request_id)s, 其他按照自己喜好来
            "format": "%(green)s%(asctime)s [%(request_id)s] %(name)s %(log_color)s%(levelname)s [pid:%(process)d] "
            "[%(filename)s->%(funcName)s:%(lineno)s] %(cyan)s%(message)s",
        }

    },
      "filters": {
        # 过滤器增加下面这行
        "request_id": {"()": "log_request_id.filters.RequestIDFilter"},
    },

      "handlers": {
            "default": {
         ...
             # handler增加下面这一行
            "filters": ["request_id"],
        },

2.3 trace_id 实战

前端展示 trace_id

模拟接口 500 报错,直接把响应 header 里面的 trace_id 展示出来。
前端实现也是非常简单,axios 拦截器中取出 trace_id 就行



根据 trace_id 定位日志

只需要 grep 一下 trace_id,能快速定位到报错信息啦~
docker logs 容器名 | grep trace_id

3、最后

  • 日常开发中,日志要输出关键的入参和出参,方便生产问题排查,而不要依赖本地 debug
  • Django 中间件是个好东西,适合全局性统一处理,无需入侵业务代码
  • 日志截图中,邮件告警同样是使用中间件实现,并且也是非常简单

完整代码可以查看我的开源项目:
https://github.com/lihuacai168/AnotherFasterRunner

公众号原文链接

共收到 2 条回复 时间 点赞

如果你有更好方案,欢迎留言和我交流。

又学一招,谢谢大佬

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册