django logging - django.request logger and extra context

The django-requestlogging middleware plugin makes it easy to log request-related information without adjusting all your logging calls to add the request with the extra parameter. It's then just a matter of configuring your loggers.

The following items can be logged when using django-requestlogging:

  • username
  • http_user_agent
  • path_info
  • remote_add
  • request_method
  • server_protocol

You can't use request.user in the format string, as %-formatting doesn't handle that. You could use a format string such as

'[%(asctime)s] %(levelname)s %(module)s %(message)s %(user)s'

and, in your logging call, use something like

logger.debug('My message with %s', 'args', extra={'user': request.user})

The extra dict is merged into the logging event record, which ends up with a user attribute, and this then gets picked up through the format string and appears in the log.

If using the django.request logger, the status_code and the request will be passed in the extra dict by Django. If you need the request.user, you'll probably need to add a logging.Filter which does something like:

class RequestUserFilter(logging.Filter):
    def filter(self, record):
        record.user = record.request.user
        return True

so that you can show the user in the formatted output.