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中logging模块的用法实例
Sep 29 Python
python将图片文件转换成base64编码的方法
Mar 14 Python
详解Python中expandtabs()方法的使用
May 18 Python
python进阶_浅谈面向对象进阶
Aug 17 Python
基于python 爬虫爬到含空格的url的处理方法
May 11 Python
在pycharm中python切换解释器失败的解决方法
Oct 29 Python
python实现小球弹跳效果
May 10 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
Sep 20 Python
python numpy中cumsum的用法详解
Oct 17 Python
wxPython之wx.DC绘制形状
Nov 19 Python
Windows下python3安装tkinter的问题及解决方法
Jan 06 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
May 26 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作的文本留言本的例子(二)
2006/10/09 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
2013/06/20 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
详解小程序如何避免多次点击,重复触发事件
2019/04/08 Javascript
Vue Autocomplete 自动完成功能简单示例
2019/05/25 Javascript
JS 事件机制完整示例分析
2020/01/15 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
Python pickle模块用法实例
2015/04/14 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
Django的信号机制详解
2017/05/05 Python
详解从Django Allauth中进行登录改造小结
2019/12/18 Python
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
电子商务专业个人的自我评价分享
2013/10/29 职场文书
文秘专业应届生求职信范文
2013/11/14 职场文书
收银出纳员岗位职责
2014/02/23 职场文书
会议室标语
2014/06/21 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
颐和园英文导游词
2015/01/30 职场文书
优化经济发展环境工作总结
2015/08/11 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
Win11如何修改dns?Win11修改dns图文教程
2022/01/18 数码科技
Python通用验证码识别OCR库ddddocr的安装使用教程
2022/07/07 Python