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中mechanize库的简单使用示例
Jan 10 Python
python实现忽略大小写对字符串列表排序的方法
Sep 25 Python
Python使用functools模块中的partial函数生成偏函数
Jul 02 Python
Python列表切片用法示例
Apr 19 Python
Numpy数组的保存与读取方法
Apr 04 Python
利用Python在一个文件的头部插入数据的实例
May 02 Python
CentOS7安装Python3的教程详解
Apr 10 Python
关于Python作用域自学总结
Jun 10 Python
python对绑定事件的鼠标、按键的判断实例
Jul 17 Python
解决pycharm同一目录下无法import其他文件
Feb 12 Python
keras 如何保存最佳的训练模型
May 25 Python
关于python中remove的一些坑小结
Jan 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
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
一个简易需要注册的留言版程序
2006/10/09 PHP
PHP 命令行参数详解及应用
2011/05/18 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
分享ThinkPHP3.2中关联查询解决思路
2015/09/20 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
得到form下的所有的input的js代码
2013/11/07 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
python getopt 参数处理小示例
2009/06/09 Python
Python实现从url中提取域名的几种方法
2014/09/26 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
Python中文件的写入读取以及附加文字方法
2019/01/23 Python
Python简单I/O操作示例
2019/03/18 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
芬兰攀岩、山地运动和户外活动用品购物网站:Bergfreunde
2016/10/06 全球购物
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
即将毕业大学生自荐信
2014/01/24 职场文书
绿色出行口号
2014/06/18 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
元旦晚会开场白
2015/05/29 职场文书
教育读书笔记
2015/07/02 职场文书
高中物理教学反思
2016/02/19 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python