当前位置: 移动技术网 > IT编程>脚本编程>Python > django利用request id便于定位及给日志加上request_id

django利用request id便于定位及给日志加上request_id

2018年09月23日  | 移动技术网IT编程  | 我要评论

冠军的利剑怎么做,ezd-417,爆爆王官网

简介

在开发大型系统的时候,往往是进行微服务化,变成了多个系统之间的交互。快速迭代你会发现线上的系统很多很复杂,这时候一个用户请求过来会经过很多内部系统,如果这时候发生错误,我们去查看日志的时候,根本不知道,哪个错误来自哪一个用户,这时候我们给每一个请求加上一个request id就可以很好的区分了。

django-log-request-id

这个项目为我们提供了轮子,直接使用即可

github:  ()

安装

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了.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网