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?
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?
stderr
ale po prostu rejestrują każdą transakcję HTTP, trochę nieistotne dla mnie ...
Odpowiedzi:
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()
click.secho
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
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.
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:9151
i 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:
Ż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 logging
do logowania i przełączył się na pakiet kliknięć . Zastąpienie click.echo
i click.secho
wyeliminowanie 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 ERROR
i zastąpieniem metod klikania pustymi funkcjami należy zapobiegać wszelkim wynikom dziennika innych niż błędy.
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
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
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