2011-11-04 8 views
36

Attualmente sto sviluppando un'applicazione basata su flask. Funziona correttamente generando il server manualmente usando app.run(). Ho provato a eseguirlo attraverso mod_wsgi ora. Stranamente, ricevo un errore di 500 e nulla nei log. Ho studiato un po 'e qui ci sono le mie conclusioni.500 Errore nei registri apache senza dati

  • L'inserimento di una riga come print >>sys.stderr, "hello" funziona come previsto. Il messaggio appare nel log degli errori.
  • Quando si chiama un metodo senza utilizzare un modello, funziona perfettamente. Errore 500.
  • L'utilizzo di un modello semplice funziona anche bene.
  • MA non appena si attiva un database accesso all'interno del modello (ad esempio il ciclo su una query) Ho ricevuto l'errore.

Il mio istinto mi dice che è SQLAlchemy che emette un errore, e forse qualche configurazione di logging fa sì che il log venga scartato ad un certo punto nell'applicazione.

Inoltre, per il test, sto usando SQLite. Questo, per quanto posso ricordare, è accessibile solo da un thread. Quindi se mod_wsgi genera più thread, si può rompere l'app.

Sono un po 'in perdita, perché si interrompe solo in esecuzione dietro mod_wsgi, che sembra anche ingoiare i miei errori. Che cosa posso fare per far comparire gli errori nell'errore_log di apache?

Per riferimento, il codice può essere visto on this github permalink.

risposta

52

Risulta che non ero completamente sbagliato. L'eccezione è stata infatti lanciata da sqlalchemy. E poiché viene trasmesso automaticamente a stdout, mod_wsgi lo ha ignorato silenziosamente (per quanto ne so).

Per rispondere alla mia domanda principale: Come visualizzare gli errori prodotti dall'app WSGI?

In realtà è molto semplice. Reindirizza i registri su stderr. L'unica cosa che devi fare, è aggiungere la seguente allo script WSGI:

import logging, sys 
logging.basicConfig(stream=sys.stderr) 

Ora, questa è la configurazione di registrazione più banali. Dato che non ho ancora messo tutto a posto per la mia applicazione, lo farò. Ma, immagino, una volta che l'applicazione maturerà avrai comunque una configurazione di registrazione più sofisticata, quindi questo non ti morderà.

Ma per il debug rapido e sporco, questo andrà benissimo.

+6

http://flask.pocoo.org/docs/errorhandling/ spiega anche questo.Se la modalità di debug è abilitata, gli errori verranno inviati al log di apache. Una volta disabilitato, è necessario configurare la registrazione o non andranno da nessuna parte. Posso confermare che 'logging.handlers.SMTPHandler' funziona bene per le applicazioni distribuite. –

+0

@ robots.jpg: mi è sfuggito che ... A volte è ovviamente meglio leggere i documenti più volte ...;) – exhuma

+0

Credo equamente tranne che non è globale: 'app.logger.addHandler (logging.StreamHandler (stream = sys.stderr)) ' – jpmc26

0

Se metti questo nella vostra config.py vi aiuterà notevolmente nel propagare gli errori fino al log degli errori apache:

PROPAGATE_EXCEPTIONS = True 
0

Ho avuto un problema simile: occasionale "Internal Server Error" senza registri. Quando usi mod_wsgi dovresti rimuovere "app.run()" perché questo avvierà sempre un server WSGI locale che non vogliamo se distribuiamo quell'applicazione su mod_wsgi. Vedi docs. Non so se questo è il tuo caso, ma spero che questo possa aiutare.