django利用request id便于定位及給日志加上request_id
簡(jiǎn)介
在開(kāi)發(fā)大型系統(tǒng)的時(shí)候,往往是進(jìn)行微服務(wù)化,變成了多個(gè)系統(tǒng)之間的交互??焖俚銜?huì)發(fā)現(xiàn)線上的系統(tǒng)很多很復(fù)雜,這時(shí)候一個(gè)用戶請(qǐng)求過(guò)來(lái)會(huì)經(jīng)過(guò)很多內(nèi)部系統(tǒng),如果這時(shí)候發(fā)生錯(cuò)誤,我們?nèi)ゲ榭慈罩镜臅r(shí)候,根本不知道,哪個(gè)錯(cuò)誤來(lái)自哪一個(gè)用戶,這時(shí)候我們給每一個(gè)請(qǐng)求加上一個(gè)Request ID就可以很好的區(qū)分了。
django-log-request-id
這個(gè)項(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
用來(lái)標(biāo)識(shí)同一個(gè)請(qǐng)求的日志,方便檢索和分析。
request_id用uuid自動(dòng)生成。如果請(qǐng)求頭有X-Request-ID,就用請(qǐng)求頭的,這樣一個(gè)請(qǐng)求涉及多個(gè)服務(wù)調(diào)用的時(shí)候可以把request_id帶過(guò)去,標(biāo)識(shí)為同一個(gè)請(qǐng)求的request_id.
下面是代碼示例。
在一個(gè)文件中自定義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打的日志就會(huì)帶上request_id了.
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
python3中的eval和exec的區(qū)別與聯(lián)系
這篇文章主要介紹了python3中的eval和exec的區(qū)別與聯(lián)系,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
Python使用VIF實(shí)現(xiàn)檢測(cè)多重共線性
多重共線性是指多元回歸模型中有兩個(gè)或兩個(gè)以上的自變量,它們之間具有高度的相關(guān)性,本文主要介紹了如何使用VIF實(shí)現(xiàn)檢測(cè)多重共線性,需要的可以參考下2023-12-12
Python3.5實(shí)現(xiàn)的三級(jí)菜單功能示例
這篇文章主要介紹了Python3.5實(shí)現(xiàn)的三級(jí)菜單功能,涉及Python針對(duì)json格式數(shù)據(jù)的讀取、遍歷、查找、判斷等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
Python使用multiprocessing實(shí)現(xiàn)多進(jìn)程的詳細(xì)步驟記錄
multiprocessing包是Python中的多進(jìn)程管理包,與threading.Thread類似,它可以利用multiprocessing.Process對(duì)象來(lái)創(chuàng)建一個(gè)進(jìn)程,下面這篇文章主要給大家介紹了關(guān)于Python使用multiprocessing實(shí)現(xiàn)多進(jìn)程的詳細(xì)步驟,需要的朋友可以參考下2024-08-08
Python中的二分查找Bisect庫(kù)使用實(shí)戰(zhàn)
在算法和數(shù)據(jù)結(jié)構(gòu)中,二分查找是一種高效的搜索算法,可用于有序數(shù)據(jù)集合的查找,Python的bisect庫(kù)為我們提供了便捷的二分查找實(shí)現(xiàn),本文將深入探討B(tài)isect庫(kù)的使用方法、性能優(yōu)勢(shì),并通過(guò)豐富的示例代碼展示其在實(shí)際應(yīng)用中的靈活性和效果2024-01-01

