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实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 Python
Python中Random和Math模块学习笔记
May 18 Python
python 禁止函数修改列表的实现方法
Aug 03 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 Python
python pandas 对时间序列文件处理的实例
Jun 22 Python
Python2包含中文报错的解决方法
Jul 09 Python
django+echart数据动态显示的例子
Aug 12 Python
通过python扫描二维码/条形码并打印数据
Nov 14 Python
python获取引用对象的个数方式
Dec 20 Python
python 解决Fatal error in launcher:错误问题
May 21 Python
利用keras使用神经网络预测销量操作
Jul 07 Python
用python进行视频剪辑
Nov 02 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
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
php多用户读写文件冲突的解决办法
2013/11/06 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
Symfony2 session用法实例分析
2016/02/04 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
在线游戏大家来找茬II
2006/09/30 Javascript
js验证表单第二部分
2006/11/25 Javascript
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
采用call方式实现js继承
2014/05/20 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
总结javascript三元运算符知识点
2018/09/28 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
python3爬取淘宝信息代码分析
2018/02/10 Python
使用Python进行目录的对比方法
2018/11/01 Python
Python爬取豆瓣视频信息代码实例
2019/11/16 Python
Python文件操作方法详解
2020/02/09 Python
Python字符串hashlib加密模块使用案例
2020/03/10 Python
Python3批量创建Crowd用户并分配组
2020/05/20 Python
HTML5语音识别标签写法附图
2013/11/18 HTML / CSS
中国电视购物:快乐购
2017/02/04 全球购物
波兰香水和化妆品购物网站:Notino.pl
2017/11/07 全球购物
英文版区域经理求职信
2013/10/23 职场文书
大学生军训自我鉴定
2014/02/12 职场文书
舞蹈毕业生的自我评价
2014/03/05 职场文书
培训研修方案
2014/06/06 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书