最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年08月26日 14:21:01   作者:carey  
這篇文章主要介紹了django利用request id便于定位及給日志加上request_id的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用django具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧

簡介

在開發(fā)大型系統(tǒng)的時候,往往是進(jìn)行微服務(wù)化,變成了多個系統(tǒng)之間的交互??焖俚銜l(fā)現(xiàn)線上的系統(tǒng)很多很復(fù)雜,這時候一個用戶請求過來會經(jīng)過很多內(nèi)部系統(tǒng),如果這時候發(fā)生錯誤,我們?nèi)ゲ榭慈罩镜臅r候,根本不知道,哪個錯誤來自哪一個用戶,這時候我們給每一個請求加上一個Request ID就可以很好的區(qū)分了。

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

用來標(biāo)識同一個請求的日志,方便檢索和分析。

request_id用uuid自動生成。如果請求頭有X-Request-ID,就用請求頭的,這樣一個請求涉及多個服務(wù)調(diào)用的時候可以把request_id帶過去,標(biāo)識為同一個請求的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, 現(xiàn)在代碼里用logging打的日志就會帶上request_id了.

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

最新評論

南充市| 吉林省| 上虞市| 岳阳县| 策勒县| 灌南县| 德保县| 曲靖市| 西盟| 遵义县| 东乡| 宝清县| 上思县| 玉门市| 山阴县| 台东县| 务川| 宁河县| 台南县| 呼伦贝尔市| 尚志市| 南京市| 云霄县| 阜宁县| 南和县| 金秀| 耿马| 襄垣县| 蒙自县| 宾阳县| 资中县| 新昌县| 乐至县| 都兰县| 陕西省| 年辖:市辖区| 汤阴县| 肃宁县| 宁阳县| 牙克石市| 屏边|