113

I have a Flask server running in standalone mode (using app.run()). But, I don't want any messages in the console, like

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

How do I disable verbose mode?

4

12 回答 12

164

您可以将 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()
于 2013-08-22T11:57:07.057 回答
17

其他答案对我来说都没有正确工作,但我根据彼得的评论找到了一个解决方案。Flask 显然不再logging用于记录,并已切换到click包。通过覆盖click.echoclick.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和用空函数覆盖 click 方法之间,应防止所有非错误日志输出。

于 2019-07-18T03:23:42.430 回答
17

此解决方案为您提供了一种获取自己的打印和堆栈跟踪的方法,但没有来自烧瓶的信息级别日志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
于 2019-02-15T12:48:23.237 回答
15

压制Serving Flask app ...

os.environ['WERKZEUG_RUN_MAIN'] = 'true'
app.run()
于 2019-05-12T21:19:19.460 回答
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)了。

于 2018-04-10T10:25:00.717 回答
9

如果您使用 WSGI 服务器,请将日志设置为无

gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)
于 2018-10-29T06:46:07.883 回答
8

迟到的答案,但我找到了一种方法来抑制每个和每个控制台消息(包括在abort(...)错误期间显示的消息)。

import os
import logging

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

这基本上是Slava VTom Wojcik给出的答案的组合

于 2019-07-02T16:40:57.993 回答
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() 或其他东西会很好,这样在各个版本中都会更加健壮。有任何想法吗?

更多关键词:flask test log remove stdout output

谢谢:

于 2016-10-12T02:29:11.797 回答
4

我花了很长时间试图用所有不同的解决方案摆脱这些响应日志,但事实证明不是 Flask / Werkzeug 而是 Gunicorn 访问日志转储在 stderr 上......

解决方案是通过在 Gunicorn 配置文件中添加此块来用 NullHandler 替换默认访问日志处理程序:

logconfig_dict = {
    "version": 1,
    "disable_existing_loggers": False,
    "handlers": {
        "console": {"class": "logging.StreamHandler", "level": "INFO"},
        "null": {"class": "logging.NullHandler"},
    },
    "loggers": {
        "gunicorn.error": {"level": "INFO", "propagate": False, "handlers": ["console"]},
        "gunicorn.access": {"level": "INFO", "propagate": False, "handlers": ["null"]},
    },
}
于 2021-04-16T12:26:20.240 回答
3

不知何故,上述选项(包括.disabled = True)都不适合我。

下面的伎俩虽然:

logging.getLogger('werkzeug').setLevel(logging.CRITICAL)

在 Python 3.7.3 下使用截至 2021 年 11 月的最新版本:

pip3 list | grep -E "(connexion|Flask|Werkzeug)"
connexion2               2.10.0
Flask                    2.0.2
Werkzeug                 2.0.2
于 2021-11-18T18:47:56.693 回答
-1

如果您真的不希望任何东西在 print() 语句旁边登录到控制台,那么一种蛮力logging.basicConfig(level=logging.FATAL)的方法是. 这将禁用所有处于致命状态的日志。它不会禁用打印,但是是的,只是一个想法:/

编辑:我意识到不给我使用的文档链接是自私的:) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial

于 2019-02-23T04:00:26.130 回答
-3

第一点:根据官方 Flask 文档,您不应该使用 app.run() 运行 Flask 应用程序。最好的解决方案是使用 uwsgi,因此您可以使用命令“--disable-logging”禁用默认烧瓶日志

例如:

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

于 2019-08-26T12:22:21.650 回答