Opened 8 years ago
Last modified 3 years ago
#29186 new Bug
"django.request" logging breaks "logging.handlers.SocketHandler" — at Version 6
| Reported by: | direx | Owned by: | HyunTae Hwang |
|---|---|---|---|
| Component: | Core (Other) | Version: | 2.0 |
| Severity: | Normal | Keywords: | |
| Cc: | Anvesh Mishra | Triage Stage: | Accepted |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Just wondering what the status of this is. I get occasional errors like the following in my log file. Looks like it's this same issue. I'm running Django 3.1.8.
--- Logging error ---
Traceback (most recent call last):
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/logging/handlers.py", line 630, in emit
s = self.makePickle(record)
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/logging/handlers.py", line 602, in makePickle
s = pickle.dumps(d, 1)
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/copyreg.py", line 65, in _reduce_ex
raise TypeError("can't pickle %s objects" % base.__name__)
TypeError: can't pickle _Input objects
Call stack:
File "/data/project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/wsgi.py", line 133, in __call__
response = self.get_response(request)
File "/data/project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 136, in get_response
request=request,
File "/data/project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/utils/log.py", line 230, in log_response
exc_info=exc_info,
Change History (6)
comment:1 by , 8 years ago
| Component: | Uncategorized → Core (Other) |
|---|---|
| Triage Stage: | Unreviewed → Accepted |
comment:2 by , 8 years ago
Just for the record: A custom SocketHandler which works around this problem could look like this:
# -*- coding: utf-8 -*-
from logging.handlers import SocketHandler as _SocketHandler
class DjangoSocketHandler(_SocketHandler):
def emit(self, record):
if hasattr(record, 'request'):
record.request = None
return super().emit(record)
I don't know if you guys want to ship this as a workaround and update the documentation accordingly. This could also be a documentation-only fix where this code is added as an example for socket logging.
On the other hand an actual fix would be nice of course. I know this is not an easy task and since the majority of people probably won't be using socket logging, a documented and supported workaround (such as the code above) might be sufficient.
comment:3 by , 7 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:4 by , 7 years ago
I made a Pull Request. https://github.com/django/django/pull/10758
Respect to direx and Tim, I think django framework has to replace the SocketHandler to its own SocketHandler that replace the WSGIRequest object with pickle-able dictionary.
Django framework should respect the design philosophy of Python. So it’s unfair changing SocketHandler.
And it’s unfair blocking SocketHandler or removing request object when it passed into handlers.
I wonder this approach is okay. Please check this PR.
comment:5 by , 7 years ago
| Has patch: | set |
|---|---|
| Patch needs improvement: | set |
comment:6 by , 4 years ago
| Description: | modified (diff) |
|---|
Just wondering what the status of this is. I get occasional errors like the following in my log file. Looks like it's this same issue. I'm running Django 3.1.8.
--- Logging error ---
Traceback (most recent call last):
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/logging/handlers.py", line 630, in emit
s = self.makePickle(record)
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/logging/handlers.py", line 602, in makePickle
s = pickle.dumps(d, 1)
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/copyreg.py", line 65, in _reduce_ex
raise TypeError("can't pickle %s objects" % base.__name__)
TypeError: can't pickle _Input objects
Call stack:
File "/data/project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/wsgi.py", line 133, in __call__
response = self.get_response(request)
File "/data/project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 136, in get_response
request=request,
File "/data/project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/utils/log.py", line 230, in log_response
exc_info=exc_info,
I'm not sure what the best solution is, but I don't think removing
requestfromextrais acceptable as that would be backwards incompatible for logging handlers using that information.