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程序与MySQL的教程
Apr 29 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
Jun 14 Python
浅谈Python的垃圾回收机制
Dec 17 Python
python3实现域名查询和whois查询功能
Jun 21 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
django自带调试服务器的使用详解
Aug 29 Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
如何用python 操作zookeeper
Dec 28 Python
解决TensorFlow训练模型及保存数量限制的问题
Mar 03 Python
python3 hdf5文件 遍历代码
May 19 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
php 广告调用类代码(支持Flash调用)
2011/08/11 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
php绘制一个扇形的方法
2015/01/24 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
js与jquery回车提交的方法
2015/02/03 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
基于JavaScript代码实现随机漂浮图片广告
2016/01/05 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
Vue.js实现模拟微信朋友圈开发demo
2017/04/20 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
微信小程序媒体组件详解(视频,音乐,图片)
2017/09/19 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
2018/05/16 Javascript
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
2018/06/13 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
[08:53]DOTA2每周TOP10 精彩击杀集锦vol.9
2014/06/26 DOTA
在Python中操作字符串之replace()方法的使用
2015/05/19 Python
python方向键控制上下左右代码
2018/01/20 Python
在django admin中添加自定义视图的例子
2019/07/26 Python
HTML5+CSS3网页加载进度条的实现,下载进度条的代码实例
2016/12/30 HTML / CSS
美国在线乐器和设备商店:Musician’s Friend
2018/07/06 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
工程预算与管理应届生求职信
2013/10/06 职场文书
外贸实习生自荐信范文
2013/11/24 职场文书
实习生自荐信范文分享
2013/11/27 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
工作会议通知
2015/04/15 职场文书
昆虫记读书笔记
2015/06/26 职场文书
实习报告范文
2019/07/30 职场文书
15个值得收藏的JavaScript函数
2021/09/15 Javascript
Python中with上下文管理协议的作用及用法
2022/03/18 Python