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操作ssh实现服务器日志下载的方法
Jun 03 Python
Python中的字典与成员运算符初步探究
Oct 13 Python
浅谈Python黑帽子取代netcat
Feb 10 Python
Tensorflow中的placeholder和feed_dict的使用
Jul 09 Python
pyqt5中QThread在使用时出现重复emit的实例
Jun 21 Python
详解Matplotlib绘图之属性设置
Aug 23 Python
python通过SSH登陆linux并操作的实现
Oct 10 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
详解python中groupby函数通俗易懂
May 14 Python
Python爬虫爬取糗事百科段子实例分享
Jul 31 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
Python尝试实现蒙特卡罗模拟期权定价
Apr 21 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通过strpos查找字符串出现位置的方法
2015/03/17 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
2016/02/15 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
JavaScript中string对象
2015/06/12 Javascript
jquery实现华丽的可折角广告代码
2015/09/02 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
Python中处理字符串之endswith()方法的使用简介
2015/05/18 Python
Python Requests 基础入门
2016/04/07 Python
python出现"IndentationError: unexpected indent"错误解决办法
2017/10/15 Python
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
tensorflow模型保存、加载之变量重命名实例
2020/01/21 Python
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
ANINE BING官方网站:奢华的衣橱基本款和时尚永恒的单品
2019/11/26 全球购物
2014年预备党员学习两会心得体会
2014/03/17 职场文书
同学聚会策划方案
2014/06/06 职场文书
高中综合实践活动总结
2014/07/07 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
使用python创建股票的时间序列可视化分析
2022/03/03 Python
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android