Вимкніть консольні повідомлення на сервері Flask


90

У мене сервер Flask працює в автономному режимі (за допомогою app.run()). Але, я не хочу жодних повідомлень у консолі, наприклад

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

Як вимкнути детальний режим?


Отже, у вас є додаток, який запускає потоки (які досить складно налагодити самостійно), а тепер ви збираєтеся придушити реєстрацію на додаток до цього? Ееш, це звучить як протилежне тому, що я б зробив .. Чим детальніше ваша реєстрація, тим краще (очевидно, поки це актуально;)).
Деміан Брехт

7
@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()

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.
валлентин

8
На жаль, через використання Flask більше не працює повністюclick.secho
Петро,

1
Зміна рівня реєстрації не повинна бути рішенням, щоб уникнути реєстрації лише одного конкретного запиту.
генеровано

12

Це рішення надає вам спосіб отримати власні відбитки та сліди стека, але без журналів рівня інформації з колби, як 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
Вуді

8

Жодна з інших відповідей не працювала правильно для мене, але я знайшов рішення на основі коментаря Пітера . Flask, очевидно, більше не використовує loggingдля ведення журналу, і перейшов на пакет кліків . Замінивши, 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та заміною методів клацання порожніми функціями слід запобігати всім вихідним журналам, що не мають помилок.


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?", Запитаєте ви. У моєму випадку було кілька зайвих журналів, від яких мені потрібно було позбутися. Мені вдалося знайти, які реєстратори додати до імен журналу за допомогою:

from flask import Flask
app = Flask(__name__)

import logging
print(logging.Logger.manager.loggerDict)

Примітка: Було б непогано, якби існував flaskapp.getLogger () або щось інше, тож це було надійніше у різних версіях. Будь-які ідеї?

Ще декілька ключових слів: журнал тестування колби, видалення результату stdout

завдяки:


6

Для придушення Serving Flask app ...:

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

1
Це працює для мене, я використовував його під час тестування колби (за допомогою nose2), це прибирає безлад у терміналі. Дякуємо
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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.