Skip to content

Instantly share code, notes, and snippets.

@SehgalDivij
Last active December 21, 2023 11:34
Show Gist options
  • Star 30 You must be signed in to star a gist
  • Fork 13 You must be signed in to fork a gist
  • Save SehgalDivij/1ca5c647c710a2c3a0397bce5ec1c1b4 to your computer and use it in GitHub Desktop.
Save SehgalDivij/1ca5c647c710a2c3a0397bce5ec1c1b4 to your computer and use it in GitHub Desktop.
Middleware in django to log all requests and responses(Inspired by another Github gist I cannot find the link to, now)
"""
Middleware to log all requests and responses.
Uses a logger configured by the name of django.request
to log all requests and responses according to configuration
specified for django.request.
"""
# import json
import logging
from django.utils.deprecation import MiddlewareMixin
import socket
import time
import json
request_logger = logging.getLogger('django.request')
class RequestLogMiddleware(MiddlewareMixin):
"""Request Logging Middleware."""
def __init__(self, *args, **kwargs):
"""Constructor method."""
super().__init__(*args, **kwargs)
def process_request(self, request):
"""Set Request Start Time to measure time taken to service request."""
if request.method in ['POST', 'PUT', 'PATCH']:
request.req_body = request.body
if str(request.get_full_path()).startswith('/api/'):
request.start_time = time.time()
def extract_log_info(self, request, response=None, exception=None):
"""Extract appropriate log info from requests/responses/exceptions."""
log_data = {
'remote_address': request.META['REMOTE_ADDR'],
'server_hostname': socket.gethostname(),
'request_method': request.method,
'request_path': request.get_full_path(),
'run_time': time.time() - request.start_time,
}
if request.method in ['PUT', 'POST', 'PATCH']:
log_data['request_body'] = json.loads(
str(request.req_body, 'utf-8'))
if response:
if response['content-type'] == 'application/json':
response_body = response.content
log_data['response_body'] = response_body
return log_data
def process_response(self, request, response):
"""Log data using logger."""
if request.method != 'GET':
if str(request.get_full_path()).startswith('/api/'):
log_data = self.extract_log_info(request=request,
response=response)
request_logger.debug(msg='', extra=log_data)
return response
def process_exception(self, request, exception):
"""Log Exceptions."""
try:
raise exception
except Exception:
request_logger.exception(msg="Unhandled Exception")
return exception
@doowonee
Copy link

doowonee commented Jul 2, 2019

thanks It's helpful.

@naorye
Copy link

naorye commented Nov 24, 2019

Line 44 shouldn't it be if response:?

@SehgalDivij
Copy link
Author

Ah Yes.

@SehgalDivij
Copy link
Author

Thanks @naorye. made the change.

@bennibau
Copy link

When I integrate it to django I get
django.core.exceptions.ImproperlyConfigured: WSGI application 'GoFish.wsgi.application' could not be loaded; Error importing module.
What am I doing wrong? I created a class and pasted your code and added it to middlewares..

@SehgalDivij
Copy link
Author

SehgalDivij commented Feb 21, 2020 via email

@bennibau
Copy link

bennibau commented Feb 21, 2020 via email

@ardinusawan
Copy link

ardinusawan commented May 12, 2020

Hi @bennibau, are you using this? https://github.com/Rhumbix/django-request-logging

No thanks, I used djang-logging middleware package and that worked fine for me

@zia-devsinc
Copy link

thanks

@moalshak
Copy link

How do I configure this in the settings.py ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment