2015-06-19 12 views
7

Ich arbeite mit einer Python/Flask-Anwendung und versuche, die Protokolle in JSON zu formatieren (nach Zeilen).Flask-App formatieren meldet sich an json

Mit dem Python-json-Logger-Paket habe ich die Formatierer für die app.logger wie folgt geändert:

from pythonjsonlogger import jsonlogger 
formatter = jsonlogger.JsonFormatter(
    '%(asctime) %(levelname) %(module) %(funcName) %(lineno) %(message)') 
app.logger.handlers[0].setFormatter(formatter) 

Dies funktioniert wie erwartet. Alle Nachrichten, die an app.logger übergeben werden, sind in json korrekt formatiert.

Die Anwendung protokolliert jedoch auch automatisch alle Anfragen. Diese Information wird in stdout wie folgt angezeigt:

127.0.0.1 - - [19/Jun/2015 12:22:03] "GET /portal/ HTTP/1.1" 200 - 

Ich möchte diese Informationen in JSON auch formatiert werden. Ich habe nach dem Logger/Code gesucht, der für das Erstellen dieser Ausgabe ohne Erfolg verantwortlich ist.

Wo wird diese Ausgabe generiert? Sind die Mechanismen zum Ändern der Formatierung dieser protokollierten Informationen?

+0

Diese Protokolle Sie sehen wahrscheinlich von dem Web-Server kommen Sie nutzen und nicht von Ihrem 'wsgi' App Welchen Server benutzen Sie? – sirfz

+0

@MartijnPieters Sie könnten Recht haben, aber es wäre nicht sinnvoll für 'Flask', Zugriffsanforderungen zu protokollieren, da es nicht seine Aufgabe sein soll – sirfz

+0

@sirfz: außer, tut es nicht. Sie sind in der Tat richtig. –

Antwort

3

Wenn Sie das Attribut app.logger zum ersten Mal verwenden, setzt Flask einige Protokollhandler auf:

  • einen Debug-Logger, die DEBUG auf Protokollebene festgelegt ist und dass Filter auf app.debug wahr zu sein.
  • ein Produktionslogger, der auf gesetzt ist.

Sie können diese Handler wieder entfernen sich selbst, indem Sie:

app.logger.handlers[:] = [] 

jedoch die Log-Zeile, die Sie sehen, ist nicht durch Flask angemeldet, sondern durch die WSGI-Server. Sowohl der eingebaute Werkzeug-Server (wird verwendet, wenn Sie verwenden) als auch verschiedene andere WSGI-Server tun dies. Gunicorn verwendet zum Beispiel den Standard-Python-Logger zum Aufzeichnen des Zugriffs.

Der integrierte WSGI-Server sollte niemals in der Produktion verwendet werden (er skaliert nicht gut und ist nicht gegen bösartige Angreifer geschützt).

Für Gunicorn können Sie Protokoll Ausbreitung zu halten die Protokollierung getrennt deaktivieren:

logging.getLogger('gunicorn').propagate = False 
Verwandte Themen