2024-06-26 07:58:24 +00:00
|
|
|
import logging
|
|
|
|
import uuid
|
|
|
|
|
|
|
|
from django.utils.deprecation import MiddlewareMixin
|
2024-07-05 13:14:47 +00:00
|
|
|
from .local_storage import set_current_trace_id, get_current_trace_id
|
2024-06-26 07:58:24 +00:00
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
class LoggingMiddleware(MiddlewareMixin):
|
|
|
|
def process_request(self, request):
|
|
|
|
trace_id = request.headers.get('X-Trace-ID', str(uuid.uuid4()))
|
|
|
|
request.META['X-Trace-ID'] = trace_id
|
2024-07-05 13:14:47 +00:00
|
|
|
set_current_trace_id(trace_id)
|
2024-06-26 07:58:24 +00:00
|
|
|
|
|
|
|
request_body = ""
|
|
|
|
content_type = request.headers.get("Content-Type", "")
|
|
|
|
if request.method in ('POST', 'PUT', 'PATCH') and not content_type.startswith("multipart/form-data"):
|
|
|
|
request_body = request.body.decode(encoding="utf-8", errors="ignore")
|
|
|
|
|
|
|
|
logger.info(f"Request: {request.method} {request.path} | Trace ID: {trace_id} | "
|
|
|
|
f"Body: {request_body} | Headers: {request.headers}")
|
|
|
|
|
|
|
|
def process_response(self, request, response):
|
|
|
|
trace_id = request.META.get('X-Trace-ID', str(uuid.uuid4()))
|
2024-06-26 09:40:33 +00:00
|
|
|
try:
|
|
|
|
response_body = response.content.decode("utf-8") if response.content else ""
|
|
|
|
except Exception as e:
|
|
|
|
logger.error(e)
|
|
|
|
response_body = ""
|
2024-06-26 07:58:24 +00:00
|
|
|
|
|
|
|
logger.info(f"Response: {request.method} {request.path} | Trace ID: {trace_id} | "
|
|
|
|
f"Status: {response.status_code} | Body: {response_body}")
|
|
|
|
|
|
|
|
response['X-Trace-ID'] = trace_id
|
|
|
|
return response
|
|
|
|
|
|
|
|
def process_exception(self, request, exception):
|
|
|
|
trace_id = request.META.get('X-Trace-ID', str(uuid.uuid4()))
|
|
|
|
logger.error(f"Exception: {request.method} {request.path} | Trace ID: {trace_id} | "
|
2024-07-05 06:32:00 +00:00
|
|
|
f"Error: {exception}")
|
|
|
|
|
|
|
|
class TraceIDLogFilter(logging.Filter):
|
|
|
|
def filter(self, record):
|
2024-07-05 13:14:47 +00:00
|
|
|
trace_id = get_current_trace_id()
|
2024-07-05 06:32:00 +00:00
|
|
|
record.trace_id = trace_id
|
|
|
|
return True
|