2014-07-01 5 views
9

Für das Leben von mir kann ich nicht herausfinden, woher meine Fehler in meiner Flask-App kommen, wenn ich es durch Gunicorn laufe, da ich nicht herausfinden kann, wie man eine Stapelspur angezeigt bekommt.Wie sieht man Ausnahmen in einer Flask + gunicorn App?

Zum Beispiel sagen wir, ich habe ein sehr einfaches "Hallo, Welt!" App in Flask geschrieben.

import logging 
import os 
from flask import Flask 

app = Flask(__name__) 
app.debug = True 

@app.route('/') 
def hello(): 
    raise Exception('Exception raised!') 
    return 'Hello World!' 

if __name__ == '__main__': 
    app.run() 

Wenn ich betreibe diese mit python hello.py, dann ist alles gut, da ich eine sehr nützliche Stack-Trace erhalten:

(venv)142:helloflask $ python hello.py 
* Running on http://127.0.0.1:5000/ 
* Restarting with reloader 
127.0.0.1 - - [30/Jun/2014 18:52:42] "GET/HTTP/1.1" 500 - 
Traceback (most recent call last): 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/Users/grautur/code/helloflask/venv/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/Users/grautur/code/helloflask/hello.py", line 10, in hello 
    raise Exception('Exception raised!') 
Exception: Exception raised! 

Wenn ich jedoch eine procfile mit

web: gunicorn hello:app 

erstellen und starte dann die App mit foreman start -p 8000, dann sehe ich gar nichts. Nur eine Webseite "Interner Serverfehler".

$ foreman start -p 8000 
18:56:10 web.1 | started with pid 36850 
(...nothing else is ever displayed...) 

Wie bekomme ich meine Flask + gunicorn App, um nützlichere Debugmeldungen anzuzeigen? Ich habe versucht, app.debug = True (und verschiedene Iterationen davon), wie es andere StackOverflow Beiträge vorgeschlagen scheint, aber es scheint nichts zu ändern.

+0

Hallo, haben Sie eine Lösung gefunden? – DavidLin

+0

Gunicorn loggt standardmäßig auf stderr und der einzige Grund, warum ich das erklären könnte, ist, wenn Gunicorn sich in einer Datei anmeldet (in diesem Fall bekommt man nichts auf stderr oder stdout). Hast du das schon ausprobiert? I.e. um gunicorn so zu konfigurieren, dass es sich mit 'web: gunicorn --error-logfile = hallo-gunicorn.log --access-logfile = hallo-gunicorn-access.log hallo: app' einloggen und sehen kann, was dort eingeloggt ist? – dimi

Antwort

5

Ich bin nicht vertraut mit Foreman, also nicht sicher, ob es in irgendeiner Weise konfiguriert werden muss, aber für Gunicorn, um etwas zu loggen, müssen Sie zuerst Protokollierung für Ihre Flask-App einrichten.

Der einfache Weg wäre es, wie die folgenden Funktionen ausführen:

import logging 

# Log only in production mode. 
if not app.debug: 
    stream_handler = logging.StreamHandler() 
    stream_handler.setLevel(logging.INFO) 
    app.logger.addHandler(stream_handler) 

StreamHandler Protokolle Stderr standardmäßig. Wenn Sie sich bei einer Datei anmelden möchten, verfügt Gunicorn über die Optionen --access-logfile und --error-logfile.

Für detailliertere Erklärungen und ein paar gute Ideen zur Flask-Fehlerbehandlung siehe docs.

+0

Python hat unter anderem 'logging.FileHandler' und' RotatingFileHandler' und 'TimedRototingFileHandler' –

0

Ich fand, dass wenn Gunicorn mit einem Upstart-Skript (Ubuntu 14.04 LTS) aktiviert wurde, Fehler von Flask in /var/log/upstart/YOUR_UPSTART_SCRIPT.log geschrieben wurden.

Egal was ich sonst versuchte, z. Die Lösung von @Audrius Kažukauskas, ich konnte nirgends Fehler oder Rückschlüsse erkennen.

Verwandte Themen