Ich entwickle derzeit eine Anwendung basierend auf flask
. Es läuft einwandfrei und der Server wird manuell mit app.run()
gestartet. Ich habe versucht, es jetzt durch mod_wsgi
zu führen. Seltsamerweise bekomme ich einen 500-Fehler und nichts in den Protokollen. Ich habe ein bisschen nachgeforscht und hier sind meine Ergebnisse.
print >>sys.stderr, "hello"
funktioniert wie erwartet. Die Meldung wird im Fehlerprotokoll angezeigt.Mein Bauch sagt mir, dass es SQLAlchemy ist, das einen Fehler ausgibt, und möglicherweise verursacht eine Protokollierungskonfiguration, dass das Protokoll irgendwann in der Anwendung verworfen wird.
Außerdem verwende ich zum Testen SQLite. Soweit ich mich erinnern kann, ist dies nur von einem Thread aus zugänglich. Wenn also mod_wsgi
mehr Threads erzeugt, kann dies die App beschädigen.
Ich bin etwas ratlos, weil es nur bricht und hinter mod_wsgi
läuft, was auch meine Fehler zu verschlucken scheint. Was kann ich tun, um die Fehler in den Apache error_log zu sprudeln?
Als Referenz kann der Code auf diesem Github-Permalink gesehen werden.
Es stellte sich heraus, dass ich nicht völlig falsch war. Die Ausnahme wurde in der Tat von der SQL-Chemie ausgelöst. Und da es standardmäßig auf stdout
gestreamt wurde, ignorierte mod_wsgi
es still (soweit ich das beurteilen kann).
Um meine Hauptfrage zu beantworten: Wie werden die von der WSGI-App verursachten Fehler angezeigt?
Es ist eigentlich sehr einfach. Leiten Sie Ihre Protokolle zu stderr
um. Das einzige, was Sie tun müssen, ist, Ihrem WSGI-Skript Folgendes hinzuzufügen:
import logging, sys
logging.basicConfig(stream=sys.stderr)
Jetzt ist dies die banalste Protokollierungskonfiguration. Da ich noch nichts für meine Bewerbung eingerichtet habe, wird dies funktionieren. Aber ich denke, sobald die Anwendung ausgereift ist, haben Sie sowieso eine ausgefeiltere Protokollierungskonfiguration, so dass Sie dies nicht beißt.
Für schnelles und schmutziges Debugging ist dies jedoch gut.
Wenn Sie dies in Ihren config.py
eingeben, wird dies wesentlich dazu beitragen, Fehler bis zum Apache-Fehlerprotokoll weiterzuleiten:
PROPAGATE_EXCEPTIONS = True
Ich hatte ein ähnliches Problem: gelegentlich "Interner Serverfehler" ohne Protokolle. Wenn Sie mod_wsgi verwenden, sollten Sie "app.run()
" entfernen, da dadurch immer ein lokaler WSGI-Server gestartet wird, den wir nicht möchten, wenn wir diese Anwendung in mod_wsgi bereitstellen. Siehe docs . Ich weiß nicht, ob dies Ihr Fall ist, aber ich hoffe, dass dies helfen kann.