django利用request id便于定位及給日志加上request_id
簡介
在開發(fā)大型系統(tǒng)的時(shí)候,往往是進(jìn)行微服務(wù)化,變成了多個系統(tǒng)之間的交互??焖俚銜l(fā)現(xiàn)線上的系統(tǒng)很多很復(fù)雜,這時(shí)候一個用戶請求過來會經(jīng)過很多內(nèi)部系統(tǒng),如果這時(shí)候發(fā)生錯誤,我們?nèi)ゲ榭慈罩镜臅r(shí)候,根本不知道,哪個錯誤來自哪一個用戶,這時(shí)候我們給每一個請求加上一個Request ID就可以很好的區(qū)分了。
django-log-request-id
這個項(xiàng)目為我們提供了輪子,直接使用即可
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)用的時(shí)候可以把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í)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
scrapy框架攜帶cookie訪問淘寶購物車功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了scrapy框架攜帶cookie訪問淘寶購物車,本文通過實(shí)例代碼圖文詳解給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Pycharm 如何設(shè)置HTML文件自動補(bǔ)全代碼或標(biāo)簽
這篇文章主要介紹了Pycharm 如何設(shè)置HTML文件自動補(bǔ)全代碼或標(biāo)簽,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05
python Matplotlib數(shù)據(jù)可視化(1):簡單入門
這篇文章主要介紹了python Matplotlib的相關(guān)資料,幫助大家入門matplotlib,繪制各種圖表,感興趣的朋友可以了解下2020-09-09
Python進(jìn)階之import導(dǎo)入機(jī)制原理詳解
在Python中,一個.py文件代表一個Module。在Module中可以是任何的符合Python文件格式的Python腳本。了解Module導(dǎo)入機(jī)制大有用處。快跟隨小編一起學(xué)習(xí)一下吧2022-11-11
python如何派生內(nèi)置不可變類型并修改實(shí)例化行為
這篇文章主要為大家詳細(xì)介紹了python如何派生內(nèi)置不可變類型并修改實(shí)例化行為,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03

