webentwicklung-frage-antwort-db.com.de

Deaktivieren Sie die Konsolenmeldungen im Flask-Server

Ich habe einen Flask-Server, der im Standalone-Modus läuft (mit app.run()). Aber ich möchte keine Nachrichten in der Konsole, wie

127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...

Wie kann ich den Verbose-Modus deaktivieren?

58
ATOzTOA

Sie können den eingestellten Pegel des Werkzeug-Loggers auf ERROR setzen. In diesem Fall werden nur Fehler protokolliert:

import logging
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)

Hier finden Sie ein voll funktionsfähiges Beispiel, das unter OSX, Python 2.7.5, Flask 0.10.0 getestet wurde:

from flask import Flask
app = Flask(__name__)

import logging
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)

@app.route("/")
def hello():
    return "Hello World!"

if __== "__main__":
    app.run()
91
Drewes

Ein weiterer Grund, warum Sie die Protokollierungsausgabe ändern möchten, ist für Tests und das Umleiten der Serverprotokolle in eine Protokolldatei.

Ich konnte den obigen Vorschlag auch nicht zum Laufen bringen, es sieht so aus, als würden Logger als Teil der App eingerichtet. Ich konnte es zum Laufen bringen, indem ich die Loglevel nach [] Start der App änderte:

... (in setUpClass)
server = Thread(target=lambda: app.run(Host=hostname, port=port, threaded=True))
server.daemon = True
server.start()
wait_for_boot(hostname, port)  # curls a health check endpoint

log_names = ['werkzeug']
app_logs = map(lambda logname: logging.getLogger(logname), log_names)
file_handler = logging.FileHandler('log/app.test.log', 'w')

for app_log in app_logs:
    for hdlr in app_log.handlers[:]:  # remove all old handlers
        app_log.removeHandler(hdlr)

    app_log.addHandler(file_handler)

Leider wird der * Running on localhost:9151 und der erste Health-Check immer noch standardmäßig gedruckt, aber bei vielen Tests wird die Ausgabe um ein Vielfaches aufgeräumt.

"Warum also log_names?", Fragst du. In meinem Fall gab es einige zusätzliche Protokolle, die ich loswerden musste. Ich konnte herausfinden, welche Logger zu log_names hinzugefügt werden sollen:

from flask import Flask
app = Flask(__name__)

import logging
print(logging.Logger.manager.loggerDict)

Randbemerkung: Es wäre schön, wenn es flaskapp.getLogger () oder etwas anderes geben würde, so dass dies robuster zwischen den Versionen war. Irgendwelche Ideen?

Einige weitere Schlüsselwörter: Flask Test Log entfernen Standardausgabe

dank an:

6
daicoden

Die @Drewes-Lösung funktioniert meistens, aber in einigen Fällen tendiere ich immer noch zu werkzeug-Protokollen. Wenn Sie wirklich keinen von ihnen sehen möchten, schlage ich vor, dass Sie es so deaktivieren.

from flask import Flask
import logging

app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.disabled = True
app.logger.disabled = True

Für mich ist es fehlgeschlagen, als abort(500) ausgelöst wurde.

5
Tom Wojcik

Späte Antwort, aber ich habe eine Möglichkeit gefunden, JEDE UND JEDE KONSOLE-NACHRICHT (einschließlich der während eines abort(...) -Fehlers angezeigten) zu unterdrücken.

import os
import logging

logging.getLogger('werkzeug').disabled = True
os.environ['WERKZEUG_RUN_MAIN'] = 'true'

Dies ist im Grunde eine Kombination der Antworten von Slava V und Tom Wojcik

2
progyammer

Diese Lösung bietet Ihnen eine Möglichkeit, Ihre eigenen Ausdrucke und Stapelspuren zu erhalten, aber ohne Protokolle auf Informationsniveau aus der Flasche als 127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 zu saugen.

from flask import Flask
import logging

app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.disabled = True
2
mrmailperson

Keine der anderen Antworten funktionierte für mich richtig, aber ich fand eine Lösung basierend auf Peters Kommentar . Flask verwendet offenbar nicht mehr logging für die Protokollierung und hat zum Paket click gewechselt. Durch Überschreiben von click.echo und click.secho habe ich die Startmeldung von Flask aus app.run() entfernt.

import logging

import click
from flask import Flask

app = Flask(__name__)

log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)

def secho(text, file=None, nl=None, err=None, color=None, **styles):
    pass

def echo(text, file=None, nl=None, err=None, color=None, **styles):
    pass

click.echo = echo
click.secho = secho

@app.route("/")
def hello():
    return "Hello World!"

if __== "__main__":
    app.run()

Zwischen dem Setzen der Protokollierungsstufe auf ERROR und dem Überschreiben der Klickmethoden mit leeren Funktionen sollte jede fehlerfreie Protokollausgabe verhindert werden.

1

Wenn Sie einen WSGI-Server verwenden, setzen Sie das Protokoll auf Keine

gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)
1

Ein brute force Weg, dies zu tun, wenn Sie wirklich nicht möchten, dass sich etwas neben der print () - Anweisung an der Konsole anmeldet, ist logging.basicConfig(level=logging.FATAL). Dies würde alle Protokolle deaktivieren, die den Status "fatal" haben. Es würde den Druck nicht deaktivieren, aber ja, nur ein Gedanke: /

EDIT: Mir wurde klar, dass es egoistisch von mir wäre, keinen Link zu der von mir verwendeten Dokumentation zu setzen:) https://docs.python.org/3/howto/logging.html#logging- Grundlegendes Tutorial

So unterdrücken Sie Serving Flask app ...:

os.environ['WERKZEUG_RUN_MAIN'] = 'true'
app.run()
0
Slava V

Der erste Punkt: Gemäß der offiziellen Flask Dokumentation sollten Sie die Flask Anwendung nicht mit app.run () ausführen. Die beste Lösung ist die Verwendung von uwsgi, daher können Sie die Standardprotokolle flask mit dem Befehl "--disable-logging" deaktivieren.

Zum Beispiel:

uwsgi --socket 0.0.0.0:8001 --disable-logging --protocol=http -w app:app

0
Anton Erjomin