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 相关文章推荐
使用beaker让Facebook的Bottle框架支持session功能
Apr 23 Python
Python的GUI框架PySide的安装配置教程
Feb 16 Python
Python 高级专用类方法的实例详解
Sep 11 Python
numpy使用fromstring创建矩阵的实例
Jun 15 Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
Oct 28 Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 Python
python 同时运行多个程序的实例
Jan 07 Python
Python基于机器学习方法实现的电影推荐系统实例详解
Jun 25 Python
pycharm修改file type方式
Nov 19 Python
python迭代器常见用法实例分析
Nov 22 Python
如何更改 pandas dataframe 中两列的位置
Dec 27 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
2014过年倒计时示例
2014/01/31 PHP
在PHP程序中使用Rust扩展的方法
2015/07/03 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
[原创]图片分页查看
2006/08/28 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
详解JavaScript的策略模式编程
2015/06/24 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
2019/08/12 Javascript
使用typescript快速开发一个cli的实现示例
2020/12/09 Javascript
[01:00] DOTA2英雄背景故事第五期之重力引力法则谜团
2020/07/16 DOTA
python检测某个变量是否有定义的方法
2015/05/20 Python
Python根据区号生成手机号码的方法
2015/07/08 Python
对python中的高效迭代器函数详解
2018/10/18 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
python操作文件的参数整理
2019/06/11 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
如何通过jdbc调用存储过程
2012/04/19 面试题
校园创业策划书
2014/01/14 职场文书
战友聚会邀请函
2014/01/18 职场文书
办公室人员先进事迹
2014/01/27 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android