Wyłącz komunikaty konsoli na serwerze Flask

90

Mam serwer Flask działający w trybie autonomicznym (przy użyciu app.run()). Ale nie chcę żadnych wiadomości w konsoli, na przykład

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

Jak wyłączyć tryb szczegółowy?

ATOzTOA
źródło
Więc teraz masz aplikację skopując wątki (które są dość trudne do debugowania siebie), a teraz idziesz do rejestrowania tłumić na szczycie tego? Eesh, brzmi jak przeciwieństwo tego, co bym zrobił ... Im bardziej szczegółowe logowanie, tym lepiej (oczywiście, o ile jest to istotne;)).
Demian Brecht
6
@DemianBrecht Chodzi o to, że logi są wysyłane, stderrale po prostu rejestrują każdą transakcję HTTP, trochę nieistotne dla mnie ...
ATOzTOA

Odpowiedzi:

131

Możesz ustawić poziom rejestratora Werkzeug na ERROR, w takim przypadku rejestrowane są tylko błędy:

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

Oto w pełni działający przykład przetestowany na OSX, Pythonie 2.7.5, Flask 0.10.0:

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 __name__ == "__main__":
    app.run()
Drewes
źródło
9
Wydaje się, że to nie powstrzymuje dzienników HTTP przed przechodzeniem do stderr; Zatrzymuje komunikat „startowy” (który wyraźnie ma nazwę modułu „werkzeug” w formacie dziennika ”.
rsb
2
Pracuje dla mnie. Komunikaty debugowania żądania są pomijane. Korzystanie z Pythona 3.5.2, Flask 0.12 i Werkzeug 0.11.11
JackLeEmmerdeur
3
Działa również przy użyciu Pythona 3.6, Flask 0.12 i Werkzeug 0.11.15.
vallentin
8
Niestety nie działa już w pełni z powodu używania Flaskaclick.secho
Peter
1
Zmiana poziomu rejestrowania nie powinna być rozwiązaniem pozwalającym uniknąć rejestrowania tylko jednego konkretnego żądania.
gented
11

To rozwiązanie zapewnia sposób na uzyskanie własnych wydruków i śladów stosu, ale bez dzienników poziomu informacji z kolby ssącej jako 127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200

from flask import Flask
import logging

app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.disabled = True
iamtodor
źródło
Działa to, gdy uruchamiam mój serwer lokalnie, ale dziwnie na Heroku tak nie jest.
Garrett
10

Rozwiązanie @Drewes działa przez większość czasu, ale w niektórych przypadkach nadal otrzymuję dzienniki werkzeug. Jeśli naprawdę nie chcesz ich widzieć, sugeruję wyłączenie ich w ten sposób.

from flask import Flask
import logging

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

U mnie zawiodło, gdy abort(500)został wychowany.

Tom Wójcik
źródło
8

W przypadku korzystania z serwera WSGI, ustaw dziennik na Brak

gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)
Jestem
źródło
To jedyne rozwiązanie, które działało u mnie i używam Flask z WSGIServer
Woody
7

Innym powodem, dla którego warto zmienić dane wyjściowe rejestrowania, są testy i przekierowanie dzienników serwera do pliku dziennika.

Nie udało mi się również uzyskać powyższej sugestii, wygląda na to, że rejestratory są konfigurowane jako część uruchamiania aplikacji. Udało mi się to uruchomić, zmieniając poziomy dziennika po uruchomieniu aplikacji:

... (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)

Niestety * Running on localhost:9151i pierwsza kontrola stanu jest nadal drukowana w celu uzyskania standardu, ale podczas wykonywania wielu testów czyści wydruk po tonie.

„Więc dlaczego log_names?”, Pytasz. W moim przypadku było kilka dodatkowych dzienników, których musiałem się pozbyć. Udało mi się znaleźć, które loggery dodać do log_names poprzez:

from flask import Flask
app = Flask(__name__)

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

Uwaga boczna: byłoby miło, gdyby istniała flaskapp.getLogger () lub coś w tym rodzaju, aby było to bardziej niezawodne w różnych wersjach. Jakieś pomysły?

Jeszcze kilka słów kluczowych: dziennik testów kolby usuwa standardowe wyjście

dzięki:

daicoden
źródło
7

Żadna z pozostałych odpowiedzi nie działała poprawnie dla mnie, ale znalazłem rozwiązanie na podstawie komentarza Petera . Flask najwyraźniej już nie używa loggingdo logowania i przełączył się na pakiet kliknięć . Zastąpienie click.echoi click.sechowyeliminowanie wiadomości startowej Flaska z app.run().

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 __name__ == "__main__":
    app.run()

Pomiędzy ustawieniem poziomu rejestrowania na ERRORi zastąpieniem metod klikania pustymi funkcjami należy zapobiegać wszelkim wynikom dziennika innych niż błędy.

Brendan Burkhart
źródło
6

Aby stłumić Serving Flask app ...:

os.environ['WERKZEUG_RUN_MAIN'] = 'true'
app.run()
Slava V
źródło
1
To działa dla mnie, użyłem go podczas testowania aplikacji flask (używając nose2), co usuwa bałagan w terminalu. Dzięki
CpK
6

Późna odpowiedź, ale znalazłem sposób, aby ukryć KAŻDĄ I KAŻDĄ WIADOMOŚĆ KONSOLI (w tym te wyświetlane podczas abort(...)błędu).

import os
import logging

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

Jest to w zasadzie połączenie odpowiedzi udzielonych przez Slavę V i Tomka Wójcika

progyammer
źródło
-1

Brute force sposób to zrobić, jeśli naprawdę nie chcesz coś do logowania do konsoli obok print () oświadczenia jest logging.basicConfig(level=logging.FATAL). Spowodowałoby to wyłączenie wszystkich dzienników, których stan jest krytyczny. Nie wyłączyłoby to drukowania, ale tak, tylko myśl: /

EDYCJA: zdałem sobie sprawę, że samolubne byłoby z mojej strony nie umieszczać linku do dokumentacji, z której korzystałem :) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial

Głęboki stan zaprzeczenia
źródło
-3

Punkt pierwszy: zgodnie z oficjalną dokumentacją Flaska, nie powinieneś uruchamiać aplikacji Flask za pomocą app.run (). Najlepszym rozwiązaniem jest użycie uwsgi, więc możesz wyłączyć domyślne logi kolb za ​​pomocą polecenia "--disable-logging"

Na przykład:

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

Anton Erjomin
źródło