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 相关文章推荐
Flask数据库迁移简单介绍
Oct 24 Python
Python实现的视频播放器功能完整示例
Feb 01 Python
python之信息加密题目详解
Jun 26 Python
Django自定义用户登录认证示例代码
Jun 30 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
Apr 23 Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
Jun 02 Python
Python datetime模块使用方法小结
Jun 18 Python
Python魔术方法专题
Jun 19 Python
Django def clean()函数对表单中的数据进行验证操作
Jul 09 Python
Python读取图像并显示灰度图的实现
Dec 01 Python
Python实现对齐打印 format函数的用法
Apr 28 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读取RSS(Feed)简单实例
2014/06/12 PHP
php通过获取头信息判断图片类型的方法
2015/06/26 PHP
鼠标移动到一张图片时变为另一张图片
2006/12/05 Javascript
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
小议Javascript中的this指针
2010/03/18 Javascript
JavaScript闭包 懂不懂由你反正我是懂了
2011/10/21 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
Node.js模块加载详解
2014/08/16 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
2015/12/10 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
深入理解vue.js中$watch的oldvalue与newValue
2017/08/07 Javascript
微信小程序实现文字跑马灯效果
2020/05/26 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
js继承的这6种方式!(上)
2019/04/23 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
对python多线程与global变量详解
2018/11/09 Python
Python绘图实现显示中文
2019/12/04 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
金融专业大学生自我评价
2014/01/09 职场文书
简历中的自我评价范文
2014/02/05 职场文书
公司演讲稿开场白
2014/08/25 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
2014年材料员工作总结
2014/11/19 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书