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:
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
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.
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
Ż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().
Pomiędzy ustawieniem poziomu rejestrowania na ERRORi zastąpieniem metod klikania pustymi funkcjami należy zapobiegać wszelkim wynikom dziennika innych niż błędy.
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: /
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"
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()
źródło
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
źródło
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.źródło
W przypadku korzystania z serwera WSGI, ustaw dziennik na Brak
gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)
źródło
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:
źródło
Ż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ąpienieclick.echo
iclick.secho
wyeliminowanie wiadomości startowej Flaska zapp.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.źródło
Aby stłumić
Serving Flask app ...
:os.environ['WERKZEUG_RUN_MAIN'] = 'true' app.run()
źródło
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
źródło
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
źródło
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
źródło