Opened 18 months ago

Last modified 3 months ago

#26688 assigned Bug

Inconsistent logging of 5xx and 4xx requests to django.request

Reported by: Samir Shah Owned by: Sergio Oliveira
Component: HTTP handling Version: master
Severity: Normal Keywords:
Cc: seocam@… Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Samir Shah)

The documentation for django.request says:

Log messages related to the handling of requests. 5XX responses are raised as ERROR messages; 4XX responses are raised as WARNING messages.

The actual behaviour is not quite consistent with this:

  • Only 4xx and 500 responses are logged to django.request - not any other responses in the 5xx range.
  • 500 responses are only logged if they are the result of an uncaught exception. The logging happens in django.core.handlers.base.handle_uncaught_exception. If a view manually sets a 500 response somewhere, this isn't logged.
  • The same was true of 404 responses (they were only logged if an uncaught Http404 was raised), until the change made in ticket:26504 inadvertently altered this behaviour. After that change, all 404s are logged regardless of how they are generated.
  • Other 4xx responses meanwhile are only logged as the result of an exception (PermissionDenied etc.), not if the status code is set manually.
  • 400 responses are logged to django.security but not to django.request.

I would be happy to submit a patch that addresses this but would like some guidance on what the best solution is. My initial thoughts are:

  • I think Django should log all 5xx responses, regardless of how they were generated. This would mean refactoring the logic that does this logging.
  • Either log all 4xx responses to django.request or change the documentation to list what specific responses are logged.

Change History (11)

comment:1 Changed 18 months ago by Samir Shah

Description: modified (diff)

comment:2 Changed 18 months ago by Sergio Oliveira

Triage Stage: UnreviewedAccepted
Type: UncategorizedBug

The logging behavior is clearly inconsistent with the docs. The documented behavior is preferable over the current one so that's actually a bug.

comment:3 Changed 18 months ago by Sergio Oliveira

Cc: seocam@… added
Owner: changed from nobody to Sergio Oliveira
Status: newassigned

comment:4 Changed 18 months ago by Sergio Oliveira

Has patch: set

comment:5 Changed 18 months ago by Carl Meyer

Triage Stage: AcceptedReady for checkin

comment:6 Changed 17 months ago by Tim Graham

Patch needs improvement: set
Triage Stage: Ready for checkinAccepted

Patch needs a rebase and I left some additional comments for improvement.

comment:7 Changed 4 months ago by Samir Shah

I've taken the liberty of updating the original PR to work with changes in the code base since it was created - https://github.com/django/django/pull/8752. Most of the original work was done by Sergio.

Last edited 4 months ago by Samir Shah (previous) (diff)

comment:8 Changed 4 months ago by Samir Shah

Patch needs improvement: unset

comment:9 Changed 3 months ago by Tim Martin

Patch needs improvement: set

This looks good to me. I had a minor documentation comment on the patch review.

comment:10 Changed 3 months ago by Samir Shah

Patch needs improvement: unset

Tim - thanks for the review. I've updated the PR to address your comments.

comment:11 Changed 3 months ago by Tim Martin

Triage Stage: AcceptedReady for checkin
Note: See TracTickets for help on using tickets.
Back to Top