2014-10-26 9 views
20

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 :

  1. Ich erhalte das erwartete HTTP 200 "Hello World \ n" als Antwort.

  2. Es gibt eine Spur der Anfrage in /var/log/demo/access.log.

  3. /var/log/demo/error.log bleibt gleich (es gibt nur die Boot-Ereignisse).

  4. Im Terminal befindet sich die Zeile "Direct output".

  5. 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?

Antwort

24

Wenn Sie python3 server.py verwenden, führen Sie das Skript server3.py aus.

Wenn Sie gunicorn server:flaskApp ... Sie führen das gunicorn Startskript, das dann Importe das Modul server und für die Variable flaskApp in diesem Modul aussieht.

Da server.py wird die __name__ importiert var "server" enthalten wird, nicht "__main__" und Sie deshalb Handler Setup-Code log nicht ausgeführt wird.

Sie könnten den Protokollhandler-Setup-Code einfach außerhalb der Zeilengruppe if __name__ == "__main__": verschieben.Aber stellen Sie sicher, dass Sie flaskApp.run() dort halten, da Sie nicht wollen, dass ausgeführt werden soll, wenn Gunicorn Importe server.

Mehr über what does if __name__ == “__main__”: do?

+0

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

8

Dieser Ansatz funktioniert gut für mich: Importieren Sie das Modul Python-Protokollierung und gunicorn der Fehler-Handler, um es hinzuzufügen. Dann wird Ihr Logger log in die gunicorn Fehlerlogdatei:

import logging 

app = Flask(__name__) 

gunicorn_error_logger = logging.getLogger('gunicorn.error') 
app.logger.handlers.extend(gunicorn_error_logger.handlers) 
app.logger.setLevel(logging.DEBUG) 
app.logger.debug('this will show in the log') 

Mein Gunicorn Startskript ist wie so in eine Datei ausgegeben Protokolleinträge konfiguriert:

gunicorn main:app \ 
    --workers 4 \ 
    --bind 0.0.0.0:9000 \ 
    --log-file /app/logs/gunicorn.log \ 
    --log-level DEBUG \ 
    --reload 
+0

Kann ich den Pfad der Protokolldatei innerhalb des Skripts stattdessen in der Befehlszeile hinzufügen? –