Вимкніть консольні повідомлення на сервері 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.