国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

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

2020-02-15 22:49:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

簡(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 = TrueREQUEST_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 loggingimport threadingimport uuidfrom django.utils.deprecation import MiddlewareMixinlocal = threading.local()class RequestIDFilter(logging.Filter): def filter(self, record): record.request_id = getattr(local, 'request_id', "none") return Trueclass 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, }, }}            
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 太保市| 长顺县| 收藏| 临洮县| 湖南省| 宣恩县| 西宁市| 邛崃市| 夏津县| 哈巴河县| 寿宁县| 方城县| 平潭县| 营口市| 宝山区| 潢川县| 凌云县| 金秀| 成都市| 宿松县| 灵台县| 轮台县| 武功县| 弥渡县| 乡宁县| 达州市| 定州市| 秦皇岛市| 福建省| 高台县| 甘孜县| 舞阳县| 博白县| 拜泉县| 互助| 汝南县| 班玛县| 公主岭市| 云龙县| 邹平县| 黄梅县|