2015-03-08 21 views
7

Ich versuche, Nachrichten in Flask sowohl in Datei und stdout zu protokollieren. Ich habe die offiziellen Flask docs gelesen und kam mit dieser:Flask Protokollierung funktioniert überhaupt nicht

from flask import Flask 
import logging 
from logging import Formatter, FileHandler 

app = Flask(__name__) 



@app.route('/') 
def hello_world(): 
    app.logger.debug('second test message...') 
    return 'Hello World!' 


if __name__ == '__main__': 
    #Setup the logger 
    file_handler = FileHandler('output.log') 
    handler = logging.StreamHandler() 
    file_handler.setLevel(logging.DEBUG) 
    handler.setLevel(logging.DEBUG) 
    file_handler.setFormatter(Formatter(
     '%(asctime)s %(levelname)s: %(message)s ' 
     '[in %(pathname)s:%(lineno)d]' 
    )) 
    handler.setFormatter(Formatter(
     '%(asctime)s %(levelname)s: %(message)s ' 
     '[in %(pathname)s:%(lineno)d]' 
    )) 
    app.logger.addHandler(handler) 
    app.logger.addHandler(file_handler) 
    app.logger.error('first test message...') 
    app.run() 

Es gibt mehrere Probleme:

  1. Keine output.log-Datei generiert wird
  2. Nur die erste Protokollmeldung funktioniert:

    app.logger.error ('Test ...')

Und nur in stdout ... der in der Ansicht "/" druckt nicht einmal auf stdout ... mache ich etwas falsch?

Dies ist die Ausgabe von dem Start der App und gehen /:

2015-03-08 11:33:27,183 ERROR: first test message... [in /home/mosquito/python_projects/flask_tst/flask_tst.py:31] 
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) 
127.0.0.1 - - [08/Mar/2015 11:33:43] "GET/HTTP/1.1" 200 - 
+0

Hat der Prozess Schreibberechtigungen für die Protokolldatei? –

+0

Hallo Klaus, ja, Prozess hat Schreibrechte im Projekt Stammordner – AlejandroVK

+0

Ich habe das gleiche Problem, auch wenn der Loglevel auf Info gesetzt ist, alles, was ich habe ist Fehlerprotokoll. Und im Produktionsmodus wird die Flasche von uwsgi betrieben. – aGuegu

Antwort

11

Ihre (debug) Log-Meldungen von Flask unterdrückt werden immer wie Sie nicht im Debug-Modus ausgeführt wird. Wenn Sie das folgende Flag auf True setzen, funktioniert Ihr Code.

app.run(debug=True) 

Die Nachrichten werden nun wie erwartet angezeigt.

BennyE$ python3 stackoverflow.py 
2015-03-08 12:04:04,650 ERROR: firs test message... [in stackoverflow.py:31] 
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) 
* Restarting with stat 
2015-03-08 12:04:04,807 ERROR: firs test message... [in stackoverflow.py:31] 
-------------------------------------------------------------------------------- 
DEBUG in stackoverflow [stackoverflow.py:11]: 
second test message... 
-------------------------------------------------------------------------------- 
2015-03-08 12:04:13,789 DEBUG: second test message... [in stackoverflow.py:11] 
192.168.178.23 - - [08/Mar/2015 12:04:13] "GET/HTTP/1.1" 200 - 
-------------------------------------------------------------------------------- 
DEBUG in stackoverflow [stackoverflow.py:11]: 
second test message... 
-------------------------------------------------------------------------------- 
2015-03-08 12:04:14,899 DEBUG: second test message... [in stackoverflow.py:11] 
192.168.178.23 - - [08/Mar/2015 12:04:14] "GET/HTTP/1.1" 200 - 

Dies ist die Ausgabe in der zugehörigen Ausgabedatei:

BennyE$ cat output.log 
2015-03-08 11:58:22,226 ERROR: firs test message... [in stackoverflow.py:31] 
2015-03-08 12:04:04,650 ERROR: firs test message... [in stackoverflow.py:31] 
2015-03-08 12:04:04,807 ERROR: firs test message... [in stackoverflow.py:31] 
2015-03-08 12:04:13,789 DEBUG: second test message... [in stackoverflow.py:11] 
2015-03-08 12:04:14,899 DEBUG: second test message... [in stackoverflow.py:11] 
+0

Scheint zu funktionieren, danke Benny! – AlejandroVK

+0

Aus dem Flask [Docs] (http://flask.pooco.org/docs/0.11/api/): "Flask wird jeden Serverfehler mit einer generischen Fehlerseite unterdrücken, es sei denn, es ist im Debug-Modus. So einfach zu aktivieren Wenn Sie den interaktiven Debugger ohne Neuladen des Codes verwenden, müssen Sie run() mit debug = True und use_loader = False aufrufen. Wenn Sie use_debugger auf True setzen, ohne sich im Debug-Modus zu befinden, werden keine Ausnahmen gefunden, weil es keine zu fangen gibt. " –

2

Thansk BennyE_HH, es funktioniert.

Aber Flask unterdrückte ERROR level log message, auch wenn der Debug-Modus deaktiviert ist (Standard ist deaktiviert).

Ich denke, wir sollten app.logger.setLevel(logging.DEBUG) aufrufen, Protokoll-Ebene zu steuern, selbst Debug-Modus ist falsch.

Verwandte Themen