Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Logging requests to django-rest-framework

For debugging purposes, I would like to use Django's logging mechanism to log each and every incoming request when it "arrives" at django-rest-framework's doorstep.

Djagno offers logging of its requests (only "warning" log level and above) in the following manner (from LOGGING section in settings.py):

'django.request': {         'handlers': ['mail_admins'],         'level': 'ERROR',         'propagate': False,  }, 

I'm looking to achieve something like this (notice: log level is DEBUG):

'rest_framework.request': {         'handlers': ['logfile'],         'level': 'DEBUG',         'propagate': False,  }, 

Is there a way I can do that without embedding a logger in to DRF's source code?
Is there maybe some sort of "Logging Backend" option in DRF I'm not aware of?

like image 973
OrPo Avatar asked Mar 22 '13 20:03

OrPo


People also ask

Does Django have log requests?

django. request will log only 4xx and 5xx requests.

How do I enable logging in Django?

By default, the LOGGING setting is merged with Django's default logging configuration using the following scheme. If the disable_existing_loggers key in the LOGGING dictConfig is set to True (which is the dictConfig default if the key is missing) then all loggers from the default configuration will be disabled.

Which authentication is best in Django REST Framework?

JSON Web Token Authentication Unlike the built-in TokenAuthentication scheme, JWT Authentication doesn't need to use a database to validate a token. A package for JWT authentication is djangorestframework-simplejwt which provides some features as well as a pluggable token blacklist app.


1 Answers

I made a generic RequestLogMiddleware that can be hooked into any Django View using decorator_from_middleware.

request_log/middleware.py

import socket import time   class RequestLogMiddleware(object):     def process_request(self, request):         request.start_time = time.time()      def process_response(self, request, response):          if response['content-type'] == 'application/json':             if getattr(response, 'streaming', False):                 response_body = '<<<Streaming>>>'             else:                 response_body = response.content         else:             response_body = '<<<Not JSON>>>'          log_data = {             'user': request.user.pk,              'remote_address': request.META['REMOTE_ADDR'],             'server_hostname': socket.gethostname(),              'request_method': request.method,             'request_path': request.get_full_path(),             'request_body': request.body,              'response_status': response.status_code,             'response_body': response_body,              'run_time': time.time() - request.start_time,         }          # save log_data in some way          return response 

request_log/mixins.py

from django.utils.decorators import decorator_from_middleware  from .middleware import RequestLogMiddleware   class RequestLogViewMixin(object):     """     Adds RequestLogMiddleware to any Django View by overriding as_view.     """      @classmethod     def as_view(cls, *args, **kwargs):         view = super(RequestLogViewMixin, cls).as_view(*args, **kwargs)         view = decorator_from_middleware(RequestLogMiddleware)(view)         return view 

my_django_rest_api/views.py

from rest_framework import generics  from ...request_log.mixins import RequestLogViewMixin  class SomeListView(     RequestLogViewMixin,     generics.ListAPIView ):     ... 
like image 76
thnee Avatar answered Sep 20 '22 15:09

thnee