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?
django. request will log only 4xx and 5xx requests.
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.
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.
I made a generic RequestLogMiddleware
that can be hooked into any Django View
using decorator_from_middleware
.
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
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
from rest_framework import generics from ...request_log.mixins import RequestLogViewMixin class SomeListView( RequestLogViewMixin, generics.ListAPIView ): ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With