Ho eseguito alcune ricerche, ma mi chiedo se qualcuno abbia uno snippet di una configurazione di registrazione per fare in modo che Django emetta solo una traccia dello stack su stdout (così posso vederlo nella finestra Terminale) quando incontra un errore durante una richiesta. Questo è specifico per lo sviluppo/debugging locale e principalmente per quando faccio richieste post AJAX e devo guardare l'HTML in Firebug per capire su quale riga si è verificato l'errore.Stampa una traccia dello stack su stdout sugli errori in Django durante l'utilizzo di manage.py runserver
risposta
È possibile creare un pezzo di middleware per farlo. Ecco un frammento modificato sto usando per un progetto:
class ExceptionLoggingMiddleware(object):
def process_exception(self, request, exception):
import traceback
print traceback.format_exc()
Luogo questo gestore nella parte middleware delle impostazioni di Django.
Gestore WSCI di sottoclasse, esegui tutto ciò che vuoi con traceback nel tuo handle_uncaught_exception
definito e usa il tuo WSGIHandler al posto di quello fornito da django durante la distribuzione.
import traceback
from django.core.handlers.wsgi import WSGIHandler
class MyWSGIHandler(WSGIHandler):
"""WSGI Handler which prints traceback to stderr"""
def handle_uncaught_exception(self, request, resolver, exc_info):
traceback.print_tb(exc_info[2], file=sys.stderr)
return super(WSGIHandler, self).handle_uncaught_exception(request, resolver, exc_info)
Usato con Apache/mod_wsgi, questo dovrebbe scrivere traceback nel log degli errori di Apache
Un altro metodo è con LOGGING. In particolare si ottiene uno stacktrace durante l'esecuzione ./manage.py runserver
aggiungendo quanto segue al settings.py di file:
LOGGING = {
'version': 1,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.request': {
'handlers':['console'],
'propagate': True,
'level':'DEBUG',
}
},
}
Questa sintassi viene dalla documentazione di Django Configuring Logging e può essere ulteriormente modificato per aumentare o diminuire la quantità di Console- registrazione.
Anche i 5XX risposte sono allevati come messaggi di errore e 4XX risposte sono cresciuti come messaggi di avviso.
Si noti che questa domanda & risposta ha un duplicato 2013 here.
Questo dovrebbe essere il metodo preferito secondo me. Hai molto più controllo su quali logger vuoi usare, cosa vuoi registrare ecc. – Andre
Ho avuto un problema simile, ma l'opzione middleware non mi è stata d'aiuto. Il motivo è che sto usando django-jsonview 0.4.3 che fornisce un decoratore che converte un dizionario in una risposta http JSON valida, anche quando la funzione decorata fallisce, quindi il metodo middleware process_exception non viene mai chiamato. Ho controllato il codice di questo decoratore e sembra che si cerca di registrare l'errore di fare questo:
...
except Exception as e:
logger = logging.getLogger('django.request')
logger.exception(unicode(e))
Tuttavia, non so perché, questo non funziona e non viene registrato nella mia console bash. Dovrei scoprire perché questo accada. Nel frattempo, sto usando un decoratore in più:
def log_errors(func):
if not settings.DEBUG:
return func
def wrapper(request, *args, **kwargs):
try:
return func(request, *args, **kwargs)
except:
print traceback.format_exc()
return wrapper
Poi, in tutti i miei punti di vista JSON:
@json_view
@log_errors
def my_view(request):
....
io di solito uso questo:
except Exception,e:
# Get line
trace=traceback.extract_tb(sys.exc_info()[2])
# Add the event to the log
output ="Error in the server: %s.\n" % (e)
output+="\tTraceback is:\n"
for (file,linenumber,affected,line) in trace:
output+="\t> Error at function %s\n" % (affected)
output+="\t At: %s:%s\n" % (file,linenumber)
output+="\t Source: %s\n" % (line)
output+="\t> Exception: %s\n" % (e)
Poi uso "uscita "per qualsiasi cosa ho bisogno: stampare su stdout, inviare una e-mail, ecc ...
È st range nessuno ha menzionato l'impostazione DEBUG_PROPAGATE_EXCEPTIONS
.Non è per la produzione, ma è molto facile da usare in ambiente di test/debug. Basta aggiungere a settings.py
:
DEBUG_PROPAGATE_EXCEPTIONS = True
Esattamente questa sembra la risposta più appropriata :) – sudhanshu
+1 per quello che vale, dopo un paio d'ore di debug di un problema di DRF e senza più test/opzioni da provare, hai letteralmente salvato la mia giornata ... – jliendo
Questa dovrebbe essere la risposta accettata, grazie mille! –
- 1. Django: manage.py non stampa la traccia stack per errori
- 2. Django manage.py verbosità di runserver
- 3. stack trace da runserver manage.py che non appare il comando
- 4. Stampa traccia dello stack da un gestore di segnale
- 5. traccia dello stack python di stampa senza sollevare nessuna eccezione
- 6. Log.e non stampa la traccia dello stack di UnknownHostException
- 7. Ottenere traccia dello stack su Android NDK
- 8. Traccia dello stack nativo su ICS?
- 9. Django colore runserver uscita
- 10. Stampa i valori dei parametri sulla traccia dello stack
- 11. nessuna traccia dello stack per errori del nodo gelsomino
- 12. Trasforma una traccia dello stack in una stringa?
- 13. Stampa di una traccia di stack da un'altra discussione
- 14. Che cosa significa "bloccato" in una traccia dello stack Java?
- 15. Django 1.4 Comando sconosciuto: 'runserver'
- 16. Come stampare una traccia dello stack in Node.js?
- 17. Come generare una traccia dello stack profondo in node.js?
- 18. PHP: traccia dello stack di registro per errori FATAL nella produzione
- 19. Individuazione della traccia dello stack effettivo Java da una traccia stack javascript
- 20. Dov'è finita la traccia dello stack?
- 21. Come visualizzare la traccia dello stack su un'eccezione rilevata?
- 22. Xcode - Traccia stack di chiamata su assert?
- 23. Come trovare questa traccia dello stack?
- 24. Come mostrare la traccia dello stack completo su eclipse?
- 25. Stampa stack di chiamate completo su printStackTrace()?
- 26. Problemi di visualizzazione della traccia dello stack C# in WinDbg
- 27. Stampa traccia di stack nella finestra di output
- 28. Come copiare una traccia dello stack dalla console cromata?
- 29. Traccia stack Java su Windows
- 30. errore runserver Django quando specifica porta
"Finestra terminale"? Stai eseguendo 'django-admin.py runserver'? –
Sì, 'manage.py runserver' in locale, ma questo sarebbe utile anche per la produzione, anche se ricevo e-mail, quindi meno di un problema. – Bialecki
l'approccio "produzione" dipende da come si è integrati con Apache, quindi sarà necessario fornire ulteriori dettagli su tale configurazione per essere sicuri di averlo compreso. –