在日常开发中,日志是问题排查最为常见的手段。
那么怎么样配置日志,才能快速的筛选出来想要的信息呢?
这个时候,需要引入 trace_id 的概念了。
在每一行日志增加 trace_id 作为标识符,筛选的时候,只需要通过 trace_id 来过滤,就能快速筛选出来需要的信息。
# 我使用的Django版本是2.2
pip install django-log-request-id~=2.0.0
Github 地址 https://github.com/dabapps/django-log-request-id
配置字段有点多,耐心点看完哦
# 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"],
},
模拟接口 500 报错,直接把响应 header 里面的 trace_id 展示出来。
前端实现也是非常简单,axios 拦截器中取出 trace_id 就行
只需要 grep 一下 trace_id,能快速定位到报错信息啦~
docker logs 容器名 | grep trace_id
完整代码可以查看我的开源项目:
https://github.com/lihuacai168/AnotherFasterRunner