Stumbled across this post while trying to solve the same issue 
*(we've had this issue since 1.10 release, but have kept with 1.9 due to 
this issue).*We're only getting this with Django 1.10+ when running behind 
uWSGI.
The issue goes away if we just run the Django dev server.

On Thursday, September 15, 2016 at 11:09:13 PM UTC-6, Ben Whale wrote:
>
> Thanks for a link to the blob, that is very helpful.
>
> You might be right, but the more I look at this the more I think it is a 
> bug.
>
> The logging message is generated in django/utils/log.py in 
> the ServerFormatter format() method. If the logging setting is 
>
> LOGGING = {                                                               
>                                       
>     'version': 1,                                                         
>                
>     'disable_existing_loggers': False,                                     
>               
>     'formatters': {                                                       
>                                                                  
>             'verbose': {                                                   
>                                                                 
>                 'format': '%(levelname)s %(asctime)s %(module)s 
> %(process)d %(thread)d %(message)s'                                        
>             },                                                             
>                                                                 
>             'simple': {                                                   
>                                                                  
>                 'format': '%(levelname)s %(message)s'                     
>                                                                  
>             },                                                             
>                                                                 
>             'django.server': {                                             
>                                                                 
>                 '()': 'django.utils.log.ServerFormatter',                 
>                                                                  
>                 'format': '[%(server_time)s] %(message)s %(request)r',     
>                                                                 
>             }                                                             
>                                                                  
>         },                                                                 
>                                                                 
>     'filters': {                                                           
>                                                                 
>         'require_debug_false': {                                           
>                                                                 
>             '()': 'django.utils.log.RequireDebugFalse',                   
>                                                                  
>         },                                                                 
>                                                                 
>         'require_debug_true': {                                           
>                                                                  
>             '()': 'django.utils.log.RequireDebugTrue',                     
>                                                                 
>         },                                                                 
>                                                                 
>     },                                                                     
>                                                                 
>     'handlers': {                                                         
>                                                                  
>         'console': {                                                       
>                                                                 
>             'level': 'DEBUG',                                             
>                                                                  
>             'filters': ['require_debug_true'],                             
>                                                                 
>             'class': 'logging.StreamHandler',                             
>                                                                  
>         },                                                                 
>                                                                 
>         'django.server': {                                                 
>                                                                 
>             'level': 'INFO',                                               
>                                                                 
>             'class': 'logging.StreamHandler',                             
>                                                                  
>             'formatter': 'django.server',                                 
>                                                                  
>         },                                                                 
>                                                                 
>         'mail_admins': {                                                   
>                                                                 
>             'level': 'DEBUG',                                             
>                                                                  
>             'filters': ['require_debug_false'],                           
>                                                                  
>             'class': 'django.utils.log.AdminEmailHandler'                 
>                                                                  
>         },                                                                 
>                                                                 
>         'log_file': {                                                     
>                                                                  
>             'level': 'DEBUG',                                             
>                                                                  
>             'filters': ['require_debug_false'],                           
>                                                                  
>             'class': 'logging.FileHandler',                               
>                                                                  
>             'formatter': 'verbose',                                       
>                                                                  
>             'filename': './django.log'                                     
>                                                                 
>         }                                                                 
>                                                                  
>     },                                                                     
>                                                                 
>     'loggers': {                                                           
>                                                                      
>         'django.server': {                                                 
>                                                                 
>             'handlers': ['django.server'],                                 
>                                                                 
>             'level': 'INFO',                                               
>                                                                 
>             'propagate': False,                                           
>                                                                  
>         },                                                                 
>                                                               
>     }                                                                     
>                                                                             
>                                                                             
>                                                     
> }
>
> then record.request is a socket object. If, however, the logging setting is
>
> LOGGING = {                                                               
>                                       
>     'version': 1,                                                         
>                
>     'disable_existing_loggers': False,                                     
>               
>     'formatters': {                                                       
>                                                                  
>             'verbose': {                                                   
>                                                                 
>                 'format': '%(levelname)s %(asctime)s %(module)s 
> %(process)d %(thread)d %(message)s'                                        
>             },                                                             
>                                                                 
>             'simple': {                                                   
>                                                                  
>                 'format': '%(levelname)s %(message)s'                     
>                                                                  
>             },                                                             
>                                                                 
>             'django.server': {                                             
>                                                                 
>                 '()': 'django.utils.log.ServerFormatter',                 
>                                                                  
>                 'format': '[%(server_time)s] %(message)s %(request)r',     
>                                                                 
>             }                                                             
>                                                                  
>         },                                                                 
>                                                                 
>     'filters': {                                                           
>                                                                 
>         'require_debug_false': {                                           
>                                                                 
>             '()': 'django.utils.log.RequireDebugFalse',                   
>                                                                  
>         },                                                                 
>                                                                 
>         'require_debug_true': {                                           
>                                                                  
>             '()': 'django.utils.log.RequireDebugTrue',                     
>                                                                 
>         },                                                                 
>                                                                 
>     },                                                                     
>                                                                 
>     'handlers': {                                                         
>                                                                  
>         'console': {                                                       
>                                                                 
>             'level': 'DEBUG',                                             
>                                                                  
>             'filters': ['require_debug_true'],                             
>                                                                 
>             'class': 'logging.StreamHandler',                             
>                                                                  
>         },                                                                 
>                                                                 
>         'django.server': {                                                 
>                                                                 
>             'level': 'INFO',                                               
>                                                                 
>             'class': 'logging.StreamHandler',                             
>                                                                  
>             'formatter': 'django.server',                                 
>                                                                  
>         },                                                                 
>                                                                 
>         'mail_admins': {                                                   
>                                                                 
>             'level': 'DEBUG',                                             
>                                                                  
>             'filters': ['require_debug_false'],                           
>                                                                  
>             'class': 'django.utils.log.AdminEmailHandler'                 
>                                                                  
>         },                                                                 
>                                                                 
>         'log_file': {                                                     
>                                                                  
>             'level': 'DEBUG',                                             
>                                                                  
>             'filters': ['require_debug_false'],                           
>                                                                  
>             'class': 'logging.FileHandler',                               
>                                                                  
>             'formatter': 'verbose',                                       
>                                                                  
>             'filename': './django.log'                                     
>                                                                 
>         }                                                                 
>                                                                  
>     },                                                                     
>                                                                 
>     'loggers': {                                                           
>                                                                 
>         'django': {                                                       
>                                                                             
>                                                                             
>                                                     
>             'handlers': ['console', 'mail_admins', 'log_file'],           
>                                                                  
>             'level': 'DEBUG',                                             
>                                                                  
>         },                                                                 
>           
>         'django.server': {                                                 
>           
>             'handlers': ['django.server'],                                 
>           
>             'level': 'INFO',                                               
>           
>             'propagate': False,                                           
>            
>         },                                                                 
>           
>         'django.request': {                                               
>            
>             'handlers': ['django.server', 'mail_admins', 'console'],       
>                                                                 
>             'level': 'DEBUG',                                             
>                                                                  
>             'propagate': False,                                           
>                                                                  
>         },                                                                 
>                                                                 
>         'django.template': {                                               
>                                                                 
>             'handlers': ['log_file', 'mail_admins', 'console'],           
>                                                                  
>             'level': 'DEBUG',                                             
>                                                                  
>             'propagate': False,                                           
>                                                                  
>         },                                                                 
>           
>     }                                                                     
>            
> }
>
> the format() method is entered twice the first time record.request is a 
> WSGIRequest object and the second time it is a socket.
>
> Interestingly there is a definite bug here as the method generates an 
> IndexError. The stack trace is:
> Traceback (most recent call last):
>   File "/usr/lib/python2.7/logging/__init__.py", line 861, in emit
>     msg = self.format(record)
>   File "/usr/lib/python2.7/logging/__init__.py", line 734, in format
>     return fmt.format(record)
>   File 
> "/home/benwhale/Documents/Projects/mwe/venv/local/lib/python2.7/site-packages/django/utils/log.py",
>  
> line 173, in format
>     if args[1][0] == '2':
> IndexError: tuple index out of range
>
> This occurs because the args object is (u'/foo',) and I think it's 
> expecting something like (u'/foo', 404, 234324) instead. This occurs on the 
> first pass through the format() method but not the second.
>
> In any case, with the appearance of an honest to god bug I'll write up two 
> bug reports and link them. At this point I don't really want to spend to 
> time necessary to determine exactly what's happening.
>
> On Friday, 16 September 2016 10:28:45 UTC+10, Tim Graham wrote:
>>
>> The logging is coming from here: 
>> https://github.com/django/django/blob/43c471e81c27542e4dc392dfa2310c5a52db35d9/django/core/servers/basehttp.py#L103
>>  
>> where self.request is indeed a "socketobject"
>>
>> I'm not sure if the WSGIRequest object is available at that point, so 
>> possibly this just needs a documentation clarification.
>>
>> On Thursday, September 15, 2016 at 7:32:25 PM UTC-4, Ben Whale wrote:
>>>
>>> Well my last reply was preemptery.
>>>
>>> A minimal working example can be produced via the following commands. 
>>> First navigate to a suitable directory then,
>>> # virtualenv venv --no-site-packages
>>> # source venv/bin/activate
>>> # pip install django
>>> # django-admin startproject mwe
>>> # vim mwe/mwe/settings.y
>>>
>>> and then entering the following at the end of the settings.py file:
>>> LOGGING = {                                                             
>>>              
>>>     'version': 1,                                                       
>>>              
>>>     'disable_existing_loggers': False,                                   
>>>             
>>>     'formatters': {                                                     
>>>              
>>>         'django.server': {                                               
>>>             
>>>             '()': 'django.utils.log.ServerFormatter',                   
>>>              
>>>             'format': '[%(server_time)s] %(message)s %(request)r',       
>>>             
>>>         }                                                               
>>>              
>>>     },                                                                   
>>>             
>>>     'handlers': {                                                       
>>>              
>>>         'django.server': {                                               
>>>             
>>>             'level': 'INFO',                                             
>>>             
>>>             'class': 'logging.StreamHandler',                           
>>>              
>>>             'formatter': 'django.server',                               
>>>              
>>>         },                                                               
>>>             
>>>     },                                                                   
>>>             
>>>     'loggers': {                                                         
>>>             
>>>         'django.server': {                                               
>>>             
>>>             'handlers': ['django.server'],                               
>>>             
>>>             'level': 'INFO',                                             
>>>             
>>>             'propagate': False,                                         
>>>              
>>>         },                                                               
>>>             
>>>     }                                                                   
>>>              
>>> }
>>>
>>> Then :wq
>>> # cd mwe
>>> # python manage.py runserver
>>>
>>> Navigate to http://127.0.0.1:8000/blargh
>>>
>>> The normal error message about routing will show. Switch back to the 
>>> console and you'll see:
>>>
>>> # python manage.py runserver
>>> Performing system checks...
>>>
>>> System check identified no issues (0 silenced).
>>> September 15, 2016 - 23:12:05
>>> Django version 1.10.1, using settings 'mwe.settings'
>>> Starting development server at http://127.0.0.1:8000/
>>> Quit the server with CONTROL-C.
>>> Not Found: /blargh
>>> [15/Sep/2016 23:12:09] "GET /blargh HTTP/1.1" 404 1918 
>>> <socket._socketobject object at 0x7fa14d58da60>
>>>
>>> That representation of the socket object is being produced by the 
>>> "%(request)r" in the formatter.
>>>
>>> Chasing this back through the call stack the request object is set 
>>> in /usr/lib/python2.7/SocketServer.py(652)__init__() as the socket. This is 
>>> seems reasonable to me, so I guess some kind of processing of the request 
>>> isn't being performed somewhere.
>>>
>>>
>>> On Friday, 16 September 2016 08:16:09 UTC+10, Ben Whale wrote:
>>>>
>>>> Thanks for the reply Tim
>>>>
>>>> Some testing seems to indicate that it is an issue with 
>>>> django-rest-framework. When I contact the web server using urls managed by 
>>>> django rest the issues occurs, when I do the same via url managed by 
>>>> vanilla django the request variable in the context object is an instance 
>>>> of 
>>>> WSGIRequest, which is far more sensible.
>>>>
>>>> I'm doing to do some more digging today to prove this and, assuming I'm 
>>>> right, will pass the bug onto the django rest guys.
>>>>
>>>> Any hints on debugging this? I haven't entered the django code base 
>>>> much before.
>>>>
>>>> On Thursday, 15 September 2016 23:21:59 UTC+10, Tim Graham wrote:
>>>>>
>>>>> If true, it does seem like a bug. Could you provide a test for 
>>>>> Django's test suite or a sample project to reproduce it?
>>>>>
>>>>> On Thursday, September 15, 2016 at 6:53:55 AM UTC-4, Ben Whale wrote:
>>>>>>
>>>>>> Hi 
>>>>>>
>>>>>> What I'd like to do is log the request body whenever the 
>>>>>> django.request logger logs something. I had assumed that the extra 
>>>>>> context 
>>>>>> referred to as request in 
>>>>>> https://docs.djangoproject.com/en/1.10/topics/logging/#django-request 
>>>>>> was something like an HTTPRequest object. It is, however, an instance 
>>>>>> of socket._socketobject.
>>>>>>
>>>>>> Is it possible to get data for logging using the socket? For example 
>>>>>> the get parameters, the post data, any information associated to a file 
>>>>>> that was sent like what every has been read out of the socket? What 
>>>>>> about 
>>>>>> the request headers?
>>>>>>
>>>>>> Why is a socket passed to the logger? I must admit that I assume this 
>>>>>> to be a bug. The user has a very limited way of interacting with the 
>>>>>> socket 
>>>>>> via the string formatting syntax and the methods of the socket (as 
>>>>>> introspected via dir) don't lend them selves to this form of access.
>>>>>>
>>>>>> I'm currently using django 1.10 if that helps.
>>>>>>
>>>>>> Thanks for any help.
>>>>>>
>>>>>>
>>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/3fad7e7c-430b-4030-b190-d38515ee7d2c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to