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遍历C盘dll文件的方法
May 06 Python
python抓取并保存html页面时乱码问题的解决方法
Jul 01 Python
Python列表删除的三种方法代码分享
Oct 31 Python
Python编程实现粒子群算法(PSO)详解
Nov 13 Python
Python实现基本数据结构中栈的操作示例
Dec 04 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
Python将列表数据写入文件(txt, csv,excel)
Apr 03 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
Pytorch的mean和std调查实例
Jan 02 Python
pytorch实现CNN卷积神经网络
Feb 19 Python
使用python创建生成动态链接库dll的方法
May 09 Python
python能做哪些生活有趣的事情
Sep 09 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
人族 Terran 魔法与科技
2020/03/14 星际争霸
php 404错误页面实现代码
2009/06/22 PHP
php常用字符串处理函数实例分析
2014/11/22 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
javascript自然分类法算法实现代码
2013/10/11 Javascript
js函数调用的方式
2014/05/06 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
2015/12/03 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
2017/07/11 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
vue使用@scroll监听滚动事件时,@scroll无效问题的解决方法详解
2019/10/15 Javascript
easyUI 实现的后台分页与前台显示功能示例
2020/06/01 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
vue实现抽屉弹窗效果
2020/11/15 Javascript
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
python 串行执行和并行执行实例
2020/04/30 Python
Django-simple-captcha验证码包使用方法详解
2020/11/28 Python
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
不打扫卫生检讨书
2014/02/12 职场文书
令人印象深刻的自荐信
2014/05/25 职场文书
公司内部升职自荐信
2015/03/27 职场文书
涨价通知怎么写
2015/04/23 职场文书
英语读书笔记
2015/07/02 职场文书
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python
maven依赖的version声明控制方式
2022/01/18 Java/Android