Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Вы можете установить заданный уровень регистратора 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()

Ответ 2

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

Ответ 3

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

from flask import Flask
import logging

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

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

Ответ 4

Еще одна причина, по которой вы можете изменить вывод журнала, - это тесты и перенаправление журналов сервера в файл журнала.

Я не мог заставить вышеприведенное предложение работать, похоже, что регистраторы настроены как часть запуска приложения. Мне удалось заставить его работать, изменив уровни журнала после, начиная приложение:

... (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

благодаря:

Ответ 5

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

gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)

Ответ 6

Для подавления Serving Flask app...:

os.environ['WERKZEUG_RUN_MAIN'] = 'true'
app.run()

Ответ 7

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

import os
import logging

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Например:

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