У мене сервер 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
Це рішення надає вам спосіб отримати власні відбитки та сліди стека, але без журналів рівня інформації з колби, як 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)
був піднятий.
Жодна з інших відповідей не працювала правильно для мене, але я знайшов рішення на основі коментаря Пітера . 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
та заміною методів клацання порожніми функціями слід запобігати всім вихідним журналам, що не мають помилок.
Ще однією причиною, по якій ви можете змінити вихідні дані журналу, є тести та перенаправлення журналів сервера у файл журналу.
Я також не міг отримати запропоновану вище пропозицію для роботи, схоже, реєстратори налаштовані як частина запуску програми. Я зміг змусити його працювати, змінивши рівні журналу після запуску програми:
... (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
завдяки:
Пізня відповідь, але я знайшов спосіб придушити КОЖНЕ І КОЖНЕ ПОВІДОМЛЕННЯ (включаючи ті, що відображаються під час 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