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单线程实现多个定时器示例
Mar 30 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
Python fileinput模块使用实例
May 28 Python
python 性能提升的几种方法
Jul 15 Python
Python键盘输入转换为列表的实例
Jun 23 Python
python实现对csv文件的列的内容读取
Jul 04 Python
Python使用matplotlib绘制三维图形示例
Aug 25 Python
Python OpenCV 使用滑动条来调整函数参数的方法
Jul 08 Python
python实现图片插入文字
Nov 26 Python
python3的UnicodeDecodeError解决方法
Dec 20 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
写一个Python脚本自动爬取Bilibili小视频
Apr 24 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
深入array multisort排序原理的详解
2013/06/18 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
PHP缓冲区用法总结
2016/02/14 PHP
php获取给定日期相差天数的方法分析
2017/02/20 PHP
PHP等比例压缩图片的实例代码
2018/07/26 PHP
Javascript & DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
JavaScript 一道字符串分解的题目
2011/08/03 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
2016/05/24 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
微信小程序实现滑动操作代码
2020/04/23 Javascript
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
Python中的rfind()方法使用详解
2015/05/19 Python
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
python实现数字炸弹游戏程序
2020/07/17 Python
2021年的Python 时间轴和即将推出的功能详解
2020/07/27 Python
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
英国在线药房和在线医生:LloydsPharmacy
2019/10/21 全球购物
名词解释型面试题(主要是网络)
2013/12/27 面试题
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
中专生毕业个人鉴定
2014/02/26 职场文书
教育技术职业规划范文
2014/03/04 职场文书
公司投资建议书
2014/05/16 职场文书
企业标语大全
2014/07/01 职场文书
加强作风建设工作总结
2014/10/23 职场文书
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
2015学校年度工作总结
2015/05/11 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书