django利用request id便于定位及给日志加上request_id


Posted in Python onAugust 26, 2018

简介

在开发大型系统的时候,往往是进行微服务化,变成了多个系统之间的交互。快速迭代你会发现线上的系统很多很复杂,这时候一个用户请求过来会经过很多内部系统,如果这时候发生错误,我们去查看日志的时候,根本不知道,哪个错误来自哪一个用户,这时候我们给每一个请求加上一个Request ID就可以很好的区分了。

django-log-request-id

这个项目为我们提供了轮子,直接使用即可

github: https://github.com/dabapps/django-log-request-id (本地下载)

安装

pip install django-log-request-id

添加middleware

需要加在其它middleware前面

MIDDLEWARE_CLASSES = (
 'log_request_id.middleware.RequestIDMiddleware',
 # ... other middleware goes here
)

header中添加RequestID

LOG_REQUEST_ID_HEADER = "HTTP_X_REQUEST_ID"
GENERATE_REQUEST_ID_IF_NOT_IN_HEADER = True
REQUEST_ID_RESPONSE_HEADER = "RESPONSE_HEADER_NAME"

日志中添加RequestID

LOGGING = {
 'version': 1,
 'disable_existing_loggers': False,
 'filters': {
 'request_id': {
  '()': 'log_request_id.filters.RequestIDFilter'
 }
 },
 'formatters': {
 'standard': {
  'format': '%(levelname)-8s [%(asctime)s] [%(request_id)s] %(name)s: %(message)s'
 },
 },
 'handlers': {
 'console': {
  'level': 'DEBUG',
  'class': 'logging.StreamHandler',
  'filters': ['request_id'],
  'formatter': 'standard',
 },
 },
 'loggers': {
 'myapp': {
  'handlers': ['console'],
  'level': 'DEBUG',
  'propagate': False,
 },
 }
}

给Django日志加上request_id

用来标识同一个请求的日志,方便检索和分析。

request_id用uuid自动生成。如果请求头有X-Request-ID,就用请求头的,这样一个请求涉及多个服务调用的时候可以把request_id带过去,标识为同一个请求的request_id.

下面是代码示例。

在一个文件中自定义Middleware和Logging Filter.

import logging
import threading
import uuid

from django.utils.deprecation import MiddlewareMixin

local = threading.local()


class RequestIDFilter(logging.Filter):
 def filter(self, record):
 record.request_id = getattr(local, 'request_id', "none")
 return True


class RequestIDMiddleware(MiddlewareMixin):
 def process_request(self, request):
 local.request_id = request.META.get('HTTP_X_REQUEST_ID', uuid.uuid4().hex)

 def process_response(self, request, response):
 if hasattr(request, 'request_id'):
  response['X-Request-ID'] = local.request_id
 try:
  del local.request_id
 except AttributeError:
  pass
 return response

然后在settings.py中引用.

LOGGING配置示例

LOGGING = {
 'filters': {
 'request_id': { # 自定义的filter
  '()': 'xxx.middlewares.RequestIDFilter'
 }
 },
 'formatters': {
 'standard': {
  'format': '%(levelname)s [%(asctime)s] [%(request_id)s] %(name)s: %(message)s' # 这里使用filter request_id里的request_id字段
 },
 },
 'handlers': {
 'console': {
  'level': 'DEBUG',
  'class': 'logging.StreamHandler',
  'filters': ['request_id'], # 这里使用上面的filter: request_id
  'formatter': 'standard', # 这里使用上面的formatter: standard
 },
 },
 'loggers': {
 'xxx': {
  'handlers': ['console'], # 这里使用上面的handler: console
  'level': 'DEBUG',
  'propagate': False,
 },
 }
}

ok, 现在代码里用logging打的日志就会带上request_id了.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python开发简易版在线音乐播放器
Mar 03 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
python实现随机梯度下降法
Mar 24 Python
使用python根据端口号关闭进程的方法
Nov 06 Python
python绘制已知点的坐标的直线实例
Jul 04 Python
Pytorch在NLP中的简单应用详解
Jan 08 Python
pycharm部署、配置anaconda环境的教程
Mar 24 Python
python实现简单学生信息管理系统
Apr 09 Python
Python手动或自动协程操作方法解析
Jun 22 Python
详解torch.Tensor的4种乘法
Sep 03 Python
详解PyTorch模型保存与加载
Apr 28 Python
彻底弄懂Python中的回调函数(callback)
Jun 25 Python
python如何创建TCP服务端和客户端
Aug 26 #Python
Django压缩静态文件的实现方法详析
Aug 26 #Python
Python实现将Excel转换成xml的方法示例
Aug 25 #Python
Python实现的简单计算器功能详解
Aug 25 #Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
Aug 25 #Python
Python使用matplotlib绘制三维图形示例
Aug 25 #Python
Python实现的括号匹配判断功能示例
Aug 25 #Python
You might like
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
2013/06/20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
php获取excel文件数据
2017/04/21 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
ExtJs3.0中Store添加 baseParams 的Bug
2010/03/10 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
node.js实现端口转发
2016/04/14 Javascript
详解vue.js组件化开发实践
2016/12/14 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
2017/07/11 Javascript
从setTimeout看js函数执行过程
2017/12/19 Javascript
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
Python实现爬取知乎神回复简单爬虫代码分享
2015/01/04 Python
python3实现暴力穷举博客园密码
2016/06/19 Python
Python3 Random模块代码详解
2017/12/04 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
python实现简单遗传算法
2018/03/19 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
Python读写压缩文件的方法
2020/07/30 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
《蚕姑娘》教学反思
2014/04/15 职场文书
运动会口号8字
2014/06/07 职场文书
安全责任书范文
2014/08/25 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android
JavaScript获取URL参数的方法分享
2022/04/07 Javascript