2013-04-20 13 views
23

Non sto cercando di accendere lo dangerous debugging console, ma la mia applicazione sta ricevendo un errore 500 e non sembra che stia scrivendo alcun risultato per me per indagare più a fondo.Facile registrazione/debug dell'applicazione con nginx, uwsgi, flask?

Ho visto this exchange on the mailing list, che mi ha portato a to this page on logging errors.

Tuttavia, ho ancora trovare questo molto confusa e hanno un paio di domande:

(1) In quale file deve la roba sotto andare?

ADMINS = ['[email protected]'] 
if not app.debug: 
    import logging 
    from logging.handlers import SMTPHandler 
    mail_handler = SMTPHandler('127.0.0.1', 
           '[email protected]', 
           ADMINS, 'YourApplication Failed') 
    mail_handler.setLevel(logging.ERROR) 
    app.logger.addHandler(mail_handler) 

... assumendo il modello di file "sempre più grande" per le applicazioni più grandi? __init__.py? config.py? run.py?

(2) Sono sopraffatto dalle opzioni lì, e non posso dire quale usare. Quali registratori devo attivare, con quali impostazioni, per replicare il debug del server python locale, arrivo allo stdout quando eseguo run.py? Trovo che il flusso di output predefinito sia molto utile, molto più del debugger interattivo nella pagina. Qualcuno ha uno schema da condividere su come impostare qualcosa che lo replica con una distribuzione di nginx, in uscita in un log?

(3) C'è qualcosa che ho bisogno di cambiare, non a livello di pallone, ma in nginx, ad esempio nel mio file /etc/nginx/sites-available/appname, per abilitare la registrazione?

UPDATE

In particolare, sto cercando informazioni come ottengo quando viene eseguito python localmente sul motivo per cui, ad esempio, un pacchetto non funziona, o dove potrebbe essere il mio errore di sintassi, o quale variabile doesn' Esistono:

$ python run.py 
Traceback (most recent call last): 
    File "run.py", line 1, in <module> 
    from myappname import app 
    File "/home/me/myappname/myappname/__init__.py", line 27, in <module> 
    file_handler.setLevel(logging.debug) 
    File "/usr/lib/python2.7/logging/__init__.py", line 710, in setLevel 
    self.level = _checkLevel(level) 
    File "/usr/lib/python2.7/logging/__init__.py", line 190, in _checkLevel 
    raise TypeError("Level not an integer or a valid string: %r" % level) 

Quando eseguo il pallone su un server, non lo vedo mai. Ho appena ricevuto un errore uWSGI nel browser e non ho idea di quale codice fosse problematico. Vorrei solo qualcosa di simile a quanto sopra scritto in un file.

Ho notato anche che impostando la seguente registrazione in realtà non scrivere molto di file, anche quando accendo il registro strada fino al livello di debug:

from logging import FileHandler 
file_handler = FileHandler('mylog.log') 
file_handler.setLevel(logging.DEBUG) 
app.logger.addHandler(file_handler) 

mylog.log è vuoto, anche quando il mio errori di applicazione su.

Sarò anche aggiungere che ho cercato di impostare il debug = True nei seguenti modi, in __init__.py:

app = Flask(__name__) 
app.debug = True 
app.config['DEBUG'] = True 
from werkzeug.debug import DebuggedApplication 
app.wsgi_app = DebuggedApplication(app.wsgi_app, True) 
app.config.from_object('config') 
app.config.update(DEBUG=True) 
app.config['DEBUG'] = True 
if __name__ == '__main__': 
    app.run(debug=True) 

Mentre nel mio file config.py, ho ...

debug = True 
Debug = True 
DEBUG = True 

Tuttavia, non si verifica alcun debug e senza registrazione o debug, è piuttosto difficile rintracciare. Errori semplicemente terminare l'applicazione con il messaggio del browser non-utile:

uWSGI Error 
Python application not found 
+0

Ho aggiornato la mia risposta in base alla domanda aggiornata. –

+2

Hai mai risolto questo problema? – hafichuk

+0

Non l'ho fatto. Impossibile ottenere una macchina di produzione ospitata, abbandonata sul pallone. – Mittenchops

risposta

2
  1. La parte in cui si creano i gestori, aggiungere al logger ecc dovrebbe essere nella clausola if __name__ == '__main__', vale a dire il vostro punto di ingresso principale. Presumo che sarebbe run.py.
  2. Non sono sicuro di poter rispondere a questo - dipende da ciò che si desidera. Ti consiglio di guardare lo logging tutorial per vedere le varie opzioni disponibili.
  3. Non credo che sia necessario modificare nulla al livello nginx.

Aggiornamento: Si potrebbe desiderare di avere una clausola di eccezione che copre le eccezioni non gestite fanno, ad esempio,

if __name__ == '__main__': 
    try: 
     app.run(debug=True) 
    except Exception: 
     app.logger.exception('Failed') 

che dovrebbe scrivere la traceback di qualsiasi eccezione che si è verificato nel app.run() al registro.

7

Impostare config['PROPAGATE_EXCEPTIONS'] a durante l'esecuzione di app in produzione e si desidera che i traceback vengano registrati nei file di registro. (Non ho provato con il gestore SMTP, però ..)

1

So che questo è un post MOLTO vecchio, ma mi sono imbattuto nel problema ora, e mi ci è voluto un po 'per trovare la soluzione. Flask invia errori al server. Stavo correndo Gunicorn con uno script di upstart su Ubuntu 14.04 LTS, e il luogo dove ho trovato i log degli errori è stato il seguente:

/var/log/upstart/myapp.log

http://docs.gunicorn.org/en/stable/deploy.html#upstart

Nel caso in cui qualche altra povera anima finisce in questa situazione.

Problemi correlati