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网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 Python
django请求返回不同的类型图片json,xml,html的实例
May 22 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
python实现一个简单的ping工具方法
Jan 31 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
Jul 04 Python
浅谈Python类中的self到底是干啥的
Nov 11 Python
python3.8与pyinstaller冲突问题的快速解决方法
Jan 16 Python
基于python实现上传文件到OSS代码实例
May 09 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 Python
python中操作文件的模块的方法总结
Feb 04 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实现微信公众平台音乐点播
2014/03/20 PHP
php生成xml时添加CDATA标签的方法
2014/10/17 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
js作用域及作用域链概念理解及使用
2013/04/15 Javascript
js的2种继承方式详解
2014/03/04 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
用jquery的attr方法实现图片切换效果
2017/02/05 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
js闭包和垃圾回收机制示例详解
2021/03/01 Javascript
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
Python解析json文件相关知识学习
2016/03/01 Python
Python 中的 else详解
2016/04/23 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
Python装饰器基础概念与用法详解
2018/12/22 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
python面试题之列表声明实例分析
2019/07/08 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
给Python学习者的文件读写指南(含基础与进阶)
2020/01/29 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
个人思想理论学习的自我鉴定
2013/11/30 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
行政处罚听证告知书
2015/07/01 职场文书
总经理致辞
2015/07/29 职场文书
学生会任命书范本
2015/09/21 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers