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 相关文章推荐
php使用递归与迭代实现快速排序示例
Jan 23 Python
python 2.6.6升级到python 2.7.x版本的方法
Oct 09 Python
python中类变量与成员变量的使用注意点总结
Apr 29 Python
django模型层(model)进行建表、查询与删除的基础教程
Nov 21 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
Python Learning 列表的更多操作及示例代码
Aug 22 Python
Python实现的删除重复文件或图片功能示例【去重】
Apr 23 Python
Python 自由定制表格的实现示例
Mar 20 Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 Python
python字符串的多行输出的实例详解
Jun 08 Python
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
Jun 13 Python
Python 恐龙跑跑小游戏实现流程
Feb 15 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图像处理类代码分享
2012/01/19 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
JavaScript Timer实现代码
2010/02/17 Javascript
JavaScript游戏之优化篇
2010/11/08 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
AngularJS中实现动画效果的方法
2016/07/28 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
解决canvas画布使用fillRect()时高度出现双倍效果的问题
2017/08/03 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
2019/02/28 Javascript
深入分析JavaScript 事件循环(Event Loop)
2020/06/19 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
Python操作CouchDB数据库简单示例
2015/03/10 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
解决Django no such table: django_session的问题
2020/04/07 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
便利店投资的创业计划书
2014/01/12 职场文书
网络工程师专家职业发展路线
2014/02/14 职场文书
新春联欢会主持词
2014/03/24 职场文书
祖国在我心中演讲稿400字
2014/05/04 职场文书
技术支持岗位职责
2015/02/13 职场文书
2015年中秋寄语
2015/07/31 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书
有关信念的名言语录集锦
2019/12/06 职场文书