Итак, теперь у вас есть приложение, запускающее потоки (которые достаточно сложно отлаживать), и теперь вы собираетесь подавить ведение журнала поверх этого? Ээш, звучит как противоположность тому, что я бы сделал ... Чем более подробным будет ваше ведение журнала, тем лучше (очевидно, если это актуально;)).
Демиан Брехт
6
@DemianBrecht Дело в том, что журналы отправляются, stderrно они просто регистрируют каждую HTTP-транзакцию, что для меня не имеет значения ...
ATOzTOA
Ответы:
132
Вы можете установить уровень логгера Werkzeug на ERROR, в этом случае регистрируются только ошибки:
Похоже, это не останавливает передачу журналов HTTP на stderr; Он ДЕЙСТВИТЕЛЬНО останавливает "стартовое" сообщение (которое явно имеет имя модуля "werkzeug" в формате журнала ".
rsb
2
Работает для меня. Сообщения отладки запроса подавляются. Использование Python 3.5.2, Flask 0.12 и Werkzeug 0.11.11
JackLeEmmerdeur
3
Также работает с Python 3.6, Flask 0.12 и Werkzeug 0.11.15.
vallentin
8
К сожалению, больше не работает полностью из-за использования Flaskclick.secho
Питер
1
Изменение уровня ведения журнала не должно быть решением, позволяющим избежать регистрации только одного конкретного запроса.
Создан
11
Это решение предоставляет вам способ получить ваши собственные отпечатки и трассировки стека, но без журналов уровня информации из flask suck as 127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200
Это работает при локальном запуске моего сервера, но, как ни странно, на Heroku это не так.
Гаррет,
10
Решение @Drewes работает большую часть времени, но в некоторых случаях я все равно получаю логи werkzeug. Если вы действительно не хотите их видеть, я предлагаю вам отключить его вот так.
Это единственное решение, которое сработало для меня, и я использую Flask с WSGIServer
Вуди,
7
Другая причина, по которой вы можете захотеть изменить вывод журнала, - это тесты и перенаправление журналов сервера в файл журнала.
Мне также не удалось заставить работать приведенное выше предложение, похоже, что регистраторы настраиваются как часть запуска приложения. Мне удалось заставить его работать, изменив уровни журнала после запуска приложения:
... (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)
К сожалению, * Running on localhost:9151первая и первая проверка работоспособности по-прежнему распечатывается в стандартном формате, но при выполнении большого количества тестов она очищает вывод до тонны.
«Так почему log_names?», Спросите вы. В моем случае мне нужно было избавиться от лишних журналов. Мне удалось найти, какие регистраторы добавить в log_names через:
from flask import Flask
app = Flask(__name__)
import logging
print(logging.Logger.manager.loggerDict)
Боковое примечание: было бы хорошо, если бы был flaskapp.getLogger () или что-то в этом роде, чтобы это было более надежным для разных версий. Любые идеи?
Еще несколько ключевых слов: журнал тестов колбы удалить вывод stdout
Ни один из других ответов не сработал для меня правильно, но я нашел решение, основанное на комментарии Питера . По-видимому, Flask больше не использует loggingдля ведения журнала и перешел на пакет click . Переопределив, click.echoи click.sechoя удалил стартовое сообщение Flask из app.run().
Перебором способ сделать это , если вы действительно не хотите что - нибудь войти в консоль рядом с печатью () заявления является logging.basicConfig(level=logging.FATAL). Это отключит все журналы со статусом «фатальный». Это не отключило бы печать, но да, просто мысль: /
Первый момент: согласно официальной документации Flask, вы не должны запускать приложение Flask с помощью app.run (). Лучшее решение - использовать uwsgi, поэтому вы можете отключить журналы фляги по умолчанию с помощью команды "--disable-logging"
stderr
но они просто регистрируют каждую HTTP-транзакцию, что для меня не имеет значения ...Ответы:
Вы можете установить уровень логгера Werkzeug на ERROR, в этом случае регистрируются только ошибки:
import logging log = logging.getLogger('werkzeug') log.setLevel(logging.ERROR)
Вот полностью рабочий пример, протестированный на OSX, Python 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
Это решение предоставляет вам способ получить ваши собственные отпечатки и трассировки стека, но без журналов уровня информации из flask suck as
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
источник
Решение @Drewes работает большую часть времени, но в некоторых случаях я все равно получаю логи werkzeug. Если вы действительно не хотите их видеть, я предлагаю вам отключить его вот так.
from flask import Flask import logging app = Flask(__name__) log = logging.getLogger('werkzeug') log.disabled = True app.logger.disabled = True
Для меня это не удалось, когда он
abort(500)
был поднят.источник
Если вы используете сервер WSGI, установите для журнала значение Нет.
gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)
источник
Другая причина, по которой вы можете захотеть изменить вывод журнала, - это тесты и перенаправление журналов сервера в файл журнала.
Мне также не удалось заставить работать приведенное выше предложение, похоже, что регистраторы настраиваются как часть запуска приложения. Мне удалось заставить его работать, изменив уровни журнала после запуска приложения:
... (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)
К сожалению,
* Running on localhost:9151
первая и первая проверка работоспособности по-прежнему распечатывается в стандартном формате, но при выполнении большого количества тестов она очищает вывод до тонны.«Так почему
log_names
?», Спросите вы. В моем случае мне нужно было избавиться от лишних журналов. Мне удалось найти, какие регистраторы добавить в log_names через:from flask import Flask app = Flask(__name__) import logging print(logging.Logger.manager.loggerDict)
Боковое примечание: было бы хорошо, если бы был flaskapp.getLogger () или что-то в этом роде, чтобы это было более надежным для разных версий. Любые идеи?
Еще несколько ключевых слов: журнал тестов колбы удалить вывод stdout
благодаря:
источник
Ни один из других ответов не сработал для меня правильно, но я нашел решение, основанное на комментарии Питера . По-видимому, Flask больше не использует
logging
для ведения журнала и перешел на пакет click . Переопределив,click.echo
иclick.secho
я удалил стартовое сообщение Flask из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()
Между установкой уровня ведения журнала
ERROR
и переопределением методов щелчка с пустыми функциями следует предотвратить вывод журнала без ошибок.источник
Чтобы подавить
Serving Flask app ...
:os.environ['WERKZEUG_RUN_MAIN'] = 'true' app.run()
источник
Поздний ответ, но я нашел способ подавить КАЖДОЕ И КАЖДОЕ КОНСОЛЬНОЕ СООБЩЕНИЕ (включая те, которые отображаются во время
abort(...)
ошибки).import os import logging logging.getLogger('werkzeug').disabled = True os.environ['WERKZEUG_RUN_MAIN'] = 'true'
По сути, это комбинация ответов Славы V и Тома Войчика.
источник
Перебором способ сделать это , если вы действительно не хотите что - нибудь войти в консоль рядом с печатью () заявления является
logging.basicConfig(level=logging.FATAL)
. Это отключит все журналы со статусом «фатальный». Это не отключило бы печать, но да, просто мысль: /РЕДАКТИРОВАТЬ: Я понял, что было бы эгоистично с моей стороны не помещать ссылку на документацию, которую я использовал :) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial
источник
Первый момент: согласно официальной документации Flask, вы не должны запускать приложение Flask с помощью app.run (). Лучшее решение - использовать uwsgi, поэтому вы можете отключить журналы фляги по умолчанию с помощью команды "--disable-logging"
Например:
uwsgi --socket 0.0.0.0:8001 --disable-logging --protocol=http -w app:app
источник