django利用request id便于定位及給日志加上request_id
簡介
在開發(fā)大型系統(tǒng)的時候,往往是進行微服務(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
用來標識同一個請求的日志,方便檢索和分析。
request_id用uuid自動生成。如果請求頭有X-Request-ID,就用請求頭的,這樣一個請求涉及多個服務(wù)調(diào)用的時候可以把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, 現(xiàn)在代碼里用logging打的日志就會帶上request_id了.
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
python3中的eval和exec的區(qū)別與聯(lián)系
這篇文章主要介紹了python3中的eval和exec的區(qū)別與聯(lián)系,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-10-10Python使用multiprocessing實現(xiàn)多進程的詳細步驟記錄
multiprocessing包是Python中的多進程管理包,與threading.Thread類似,它可以利用multiprocessing.Process對象來創(chuàng)建一個進程,下面這篇文章主要給大家介紹了關(guān)于Python使用multiprocessing實現(xiàn)多進程的詳細步驟,需要的朋友可以參考下2024-08-08