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的re模块应用实例
Sep 26 Python
跟老齐学Python之Import 模块
Oct 13 Python
Python itertools模块详解
May 09 Python
Python函数式编程指南(二):从函数开始
Jun 24 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
python 实现在txt指定行追加文本的方法
Apr 29 Python
使用apiDoc实现python接口文档编写
Nov 19 Python
python中栈的原理及实现方法示例
Nov 27 Python
pandas的相关系数与协方差实例
Dec 27 Python
TensorFlow tf.nn.conv2d实现卷积的方式
Jan 03 Python
Python中使用ipython的详细教程
Jun 22 Python
Python测试框架pytest高阶用法全面详解
Jun 01 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
教你IIS6的PHP最佳配置方法
2006/09/05 PHP
php入门学习知识点五 关于php数组的几个基本操作
2011/07/14 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
通过JAVAScript实现页面自适应
2007/01/19 Javascript
js DOM的学习笔记
2011/12/22 Javascript
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
2013/06/06 Javascript
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
分享javascript、jquery实用代码段
2016/10/20 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
详解Angular的8个主要构造块
2017/06/20 Javascript
Vue.js项目部署到服务器的详细步骤
2017/07/17 Javascript
JavaScript正则表达式和级联效果
2017/09/14 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
2018/09/14 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
django页面跳转问题及注意事项
2019/07/18 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
2020/09/20 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
幼儿园大班新学期寄语
2014/01/18 职场文书
小学生红领巾广播稿
2014/01/21 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
师德师风培训感言
2015/08/03 职场文书
python b站视频下载的五种版本
2021/05/27 Python