Ich versuche Logging zu einer Webanwendung hinzuzufügen, die Flask verwendet.Warum erstellt die Flask-Anwendung keine Protokolle, wenn sie von Gunicorn gehostet wird?
Bei der Verwendung des integrierten Servers (d. H. python3 server.py
) erfolgt die Protokollierung. Bei der Verwendung von Gunicorn wird die Protokolldatei nicht erstellt.
Die einfachste Code, der das Problem reproduziert, ist dieses:
#!/usr/bin/env python
import logging
from flask import Flask
flaskApp = Flask(__name__)
@flaskApp.route('/')
def index():
flaskApp.logger.info('Log message')
print('Direct output')
return 'Hello World\n'
if __name__ == "__main__":
logHandler = logging.FileHandler('/var/log/demo/app.log')
logHandler.setLevel(logging.INFO)
flaskApp.logger.addHandler(logHandler)
flaskApp.logger.setLevel(logging.INFO)
flaskApp.run()
Die Anwendung aufgerufen wird:
gunicorn server:flaskApp -b :80 -w 4
--access-gfile /var/log/demo/access.log
--error-logfile /var/log/demo/error.log
Wenn eine Anfrage an die Homepage der Website zu tun, geschieht folgendes :
Ich erhalte das erwartete HTTP 200 "Hello World \ n" als Antwort.
Es gibt eine Spur der Anfrage in
/var/log/demo/access.log
./var/log/demo/error.log
bleibt gleich (es gibt nur die Boot-Ereignisse).Im Terminal befindet sich die Zeile "Direct output".
Es gibt keine '/var/log/demo/app.log'. Wenn ich die Datei vor dem Start der Anwendung erstelle, wird die Datei nicht geändert.
Beachten Sie, dass:
Das Verzeichnis
/var/log/demo
kann (Lesen, Schreiben, Ausführen) von jedermann zugegriffen werden, so ist dies nicht das Problem mit den Berechtigungen.Wenn ich
StreamHandler
als zweiten Handler hinzufügen, gibt es immer noch keine Spur der Meldung "Nachricht protokollieren" weder im Terminal noch in den Protokolldateien von Gunicorn.Gunicorn wird unter Verwendung von
pip3 install gunicorn
installiert, daher sollte es keine Unstimmigkeiten mit Python-Versionen geben.
Was passiert?
auch, dass die Kolben läuft im Produktionsmodus beachten Sie durch Standard unter Gunicorn, wobei die Ebene app.logger auf WARN gesetzt ist, sodass app.logger.info() oder app.logger.debug() nicht angezeigt wird. Wenn Sie das möchten, legen Sie app.debug = True fest. – patricksurry