Отключить консольные сообщения на сервере Flask

90

У меня есть сервер Flask, работающий в автономном режиме (использующий app.run()). Но мне не нужны сообщения в консоли, например

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

Как отключить подробный режим?

АТОзТОА
источник
Итак, теперь у вас есть приложение, запускающее потоки (которые достаточно сложно отлаживать), и теперь вы собираетесь подавить ведение журнала поверх этого? Ээш, звучит как противоположность тому, что я бы сделал ... Чем более подробным будет ваше ведение журнала, тем лучше (очевидно, если это актуально;)).
Демиан Брехт
6
@DemianBrecht Дело в том, что журналы отправляются, stderrно они просто регистрируют каждую HTTP-транзакцию, что для меня не имеет значения ...
ATOzTOA

Ответы:

132

Вы можете установить уровень логгера 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()
Drewes
источник
9
Похоже, это не останавливает передачу журналов 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

from flask import Flask
import logging

app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.disabled = True
иамтодор
источник
Это работает при локальном запуске моего сервера, но, как ни странно, на Heroku это не так.
Гаррет,
10

Решение @Drewes работает большую часть времени, но в некоторых случаях я все равно получаю логи werkzeug. Если вы действительно не хотите их видеть, я предлагаю вам отключить его вот так.

from flask import Flask
import logging

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

Для меня это не удалось, когда он abort(500)был поднят.

Том Войчик
источник
8

Если вы используете сервер WSGI, установите для журнала значение Нет.

gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)
Ами
источник
Это единственное решение, которое сработало для меня, и я использую 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

благодаря:

Daicoden
источник
7

Ни один из других ответов не сработал для меня правильно, но я нашел решение, основанное на комментарии Питера . По-видимому, 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и переопределением методов щелчка с пустыми функциями следует предотвратить вывод журнала без ошибок.

Брендан Буркхарт
источник
6

Чтобы подавить Serving Flask app ...:

os.environ['WERKZEUG_RUN_MAIN'] = 'true'
app.run()
Слава В
источник
1
У меня это работает, я использовал его при тестировании приложения фляги (с использованием носа2), это убирает беспорядок в терминале. Спасибо
CpK
6

Поздний ответ, но я нашел способ подавить КАЖДОЕ И КАЖДОЕ КОНСОЛЬНОЕ СООБЩЕНИЕ (включая те, которые отображаются во время abort(...)ошибки).

import os
import logging

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

По сути, это комбинация ответов Славы V и Тома Войчика.

прогьяммер
источник
-1

Перебором способ сделать это , если вы действительно не хотите что - нибудь войти в консоль рядом с печатью () заявления является logging.basicConfig(level=logging.FATAL). Это отключит все журналы со статусом «фатальный». Это не отключило бы печать, но да, просто мысль: /

РЕДАКТИРОВАТЬ: Я понял, что было бы эгоистично с моей стороны не помещать ссылку на документацию, которую я использовал :) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial

Глубокое состояние отрицания
источник
-3

Первый момент: согласно официальной документации Flask, вы не должны запускать приложение Flask с помощью app.run (). Лучшее решение - использовать uwsgi, поэтому вы можете отключить журналы фляги по умолчанию с помощью команды "--disable-logging"

Например:

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

Антон Ержомин
источник