在Flask服务器中禁用控制台消息

时间:2013-02-15 05:29:25

标签: python flask

我有一个以独立模式运行的Flask服务器(使用app.run())。但是,我不希望在控制台中有任何消息,比如

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

如何禁用详细模式?

12 个答案:

答案 0 :(得分:95)

您可以将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()

答案 1 :(得分:6)

您可能想要更改日志记录输出的另一个原因是测试,并将服务器日志重定向到日志文件。

我无法获得上述建议,看起来记录器是作为应用程序启动的一部分设置的。我能够通过在启动应用程序后更改日志级别来使其正常工作:

... (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()或者其他什么东西,这样会更好。有什么想法吗?

更多关键词:烧瓶测试日志删除标准输出

感谢:

答案 2 :(得分:5)

@Drewes解决方案大部分时间都有效,但在某些情况下,我仍然倾向于获取werkzeug日志。如果你真的不想看到它们中的任何一个,我建议你这样禁用它。

from flask import Flask
import logging

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

对我来说,abort(500)被提出时失败了。

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

此解决方案为您提供了一种获取自己的打印件和堆栈轨迹的方法,但没有从烧瓶中吸取from flask import Flask import logging app = Flask(__name__) log = logging.getLogger('werkzeug') log.disabled = True 的信息级别日志

<div class="row">
    <div class="col s6"></div>
    <div class="col s3"></div>
    <div class="col s3"></div>
    <div class="col s3"></div>
    <div class="col s3"></div>
    <div class="col s4"></div>
</div>

答案 5 :(得分:2)

最新答案,但我发现了一种抑制每次和每个控制台消息(包括在abort(...)错误期间显示的消息)的方法。

import os
import logging

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

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

答案 6 :(得分:2)

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

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

ws

答案 7 :(得分:1)

抑制Serving Flask app ...

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

答案 8 :(得分:1)

我是这样做的:

from flask.logging import default_handler
app.logger.removeHandler(default_handler)

然后控制台消息消失了……

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

其他答案对我来说都无法正常工作,但是我发现了基于Peter's comment的解决方案。 Flask显然不再使用logging进行日志记录,并且已切换到click软件包。通过覆盖click.echoclick.secho,我从app.run()中消除了Flask的启动消息。

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方法之间,应防止所有非错误日志输出。

答案 11 :(得分:0)

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

例如:

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