У меня есть сервер Flask, работающий в автономном режиме (использующий app.run()
). Но мне не нужны сообщения в консоли, например
127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...
Как отключить подробный режим?
У меня есть сервер Flask, работающий в автономном режиме (использующий app.run()
). Но мне не нужны сообщения в консоли, например
127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...
Как отключить подробный режим?
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)
был поднят.
Другая причина, по которой вы можете захотеть изменить вывод журнала, - это тесты и перенаправление журналов сервера в файл журнала.
Мне также не удалось заставить работать приведенное выше предложение, похоже, что регистраторы настраиваются как часть запуска приложения. Мне удалось заставить его работать, изменив уровни журнала после запуска приложения:
... (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
и переопределением методов щелчка с пустыми функциями следует предотвратить вывод журнала без ошибок.
Поздний ответ, но я нашел способ подавить КАЖДОЕ И КАЖДОЕ КОНСОЛЬНОЕ СООБЩЕНИЕ (включая те, которые отображаются во время 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