2016-03-08 11 views
7

sto utilizzando logger di default in Django avendo seguente configurazione:posta anche per Django Admin mentre errore del server

LOGGING = { 
'version': 1, 
'disable_existing_loggers': False, 
'filters': { 
'require_debug_false': { 
    '()': 'django.utils.log.RequireDebugFalse' 
    } 
}, 
'handlers': { 
    'mail_admins': { 
     'level': 'ERROR', 
     'filters': ['require_debug_false'], 
     'class': 'django.utils.log.AdminEmailHandler' 
    }, 
    'console': { 
     'level': 'DEBUG', 
     'class': 'logging.StreamHandler' 
    } 
}, 
'loggers': { 
    'django.request': { 
     'handlers': ['mail_admins', 'console'], 
     'level': 'ERROR', 
     'propagate': True, 
    }, 
} 

}

Così ogni volta che sto ottenendo 500 errore che sto correttamente ottenendo le mail nell'ID dell'amministratore, ma non invia i dati JSON della richiesta POST. Sto inviando la richiesta come segue:

curl -X POST -H 'Content-Type: application/json' http://127.0.0.1/api/customer/ -d "{'username':'rajeevnith', 'frist_name': 'Rajeev', 'last_name':'Bahrdwaj'}" 

Come possiamo configurare il logger di django per inviare anche questo corpo di richiesta?

+0

si potrebbe desiderare di guardare a questo http://stackoverflow.com/a/13940055/2028375 –

+0

Ha davvero non registra la richiesta? Ho una configurazione di registrazione di default molto simile e vedo l'intero oggetto di richiesta nei miei log. I documenti di Django indicano anche che l'oggetto della richiesta viene registrato usando l'argomento extra: https://docs.djangoproject.com/ja/1.9/topics/logging/#django-request che mi indica che o non lo vedi ed è lì, o hai qualcosa sovrascritto da qualche parte nel tuo codice per far sì che non si comporti come è stato costruito. –

+0

@TitusP No, non invia interi oggetti di richiesta. È solo l'invio di request.GET, request.POST, richiesta. FILE, request.COOKIES e request.META mentre durante la pubblicazione dei dati in Content-Type: application/json, i dati sono in request.body –

risposta

0

utilizziamo un gestore di posta amministratore come questo, che funziona per qualsiasi tipo di errore. spero che funzioni per te

class MyAdminEmailHandler(AdminEmailHandler): 

    def __init__(MyAdminEmailHandler, include_html=False, email_backend=None): 
     super(MyAdminEmailHandler, self).__init__(self, include_html, email_backend) 

    def emit(self, record): 
     try: 
      request = record.request 
      subject = '%s (%s IP): %s' % (
       record.levelname, 
       ('internal' if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS 
       else 'EXTERNAL'), 
       record.getMessage() 
      ) 
      filter = get_exception_reporter_filter(request) 
      request_repr = '\n{0}'.format(force_text(filter.get_request_repr(request))) 
     except Exception: 
      subject = '%s: %s' % (
       record.levelname, 
       record.getMessage() 
      ) 
      request = None 
      request_repr = "unavailable" 
     subject = self.format_subject(subject) 

     if record.exc_info: 
      exc_info = record.exc_info 
     else: 
      exc_info = (None, record.getMessage(), None) 

     message = "%s\n\nRequest repr(): %s" % (self.format(record), request_repr) 

     reporter = ExceptionReporter(request, is_email=True, *exc_info) 
     html_message = reporter.get_traceback_html() if self.include_html else None 

     try: 
      mail.mail_admins(subject, message, fail_silently=True, 
          html_message=html_message, 
          connection=self.connection()) 
     except Exception as e: 
      console_logger.warn("%s : %s" % (__name__, str(e)))