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

ATO*_*TOA 71 python flask

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

127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...
Run Code Online (Sandbox Code Playgroud)

如何禁用详细模式?

Dre*_*wes 105

您可以将Werkzeug记录器的设置级别设置为ERROR,在这种情况下,只记录错误:

import logging
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)
Run Code Online (Sandbox Code Playgroud)

以下是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()
Run Code Online (Sandbox Code Playgroud)

  • 这似乎并没有阻止HTTP日志进入stderr; 它会停止"开始"消息(它明显具有日志格式中的"werkzeug"模块名称". (8认同)
  • 不幸的是,由于Flask使用`click.secho`,不再完全有效 (5认同)
  • 为我工作。请求调试消息被抑制。使用 Python 3.5.2、Flask 0.12 和 Werkzeug 0.11.11 (3认同)
  • 更改日志记录级别不应成为避免仅记录一个特定请求的解决方案。 (3认同)
  • 也可以使用Python 3.6,Flask 0.12和Werkzeug 0.11.15. (2认同)

小智 15

其他答案都不适合我,但我找到了基于彼得评论的解决方案。Flask 显然不再logging用于日志记录,并已切换到click包。通过覆盖click.echoclick.secho我从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()
Run Code Online (Sandbox Code Playgroud)

在将日志记录级别设置为ERROR和使用空函数覆盖单击方法之间,应防止所有非错误日志输出。


Sla*_*a V 11

压制Serving Flask app ...

os.environ['WERKZEUG_RUN_MAIN'] = 'true'
app.run()
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,我在测试烧瓶应用程序时使用它(使用nose2)这消除了终端中的混乱。谢谢 (3认同)

iam*_*dor 9

该解决方案为您提供了一种获取自己的打印件和堆栈轨迹的方法,但是却没有烧瓶吸收的信息级别日志。 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
Run Code Online (Sandbox Code Playgroud)


Tom*_*cik 7

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

from flask import Flask
import logging

app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.disabled = True
app.logger.disabled = True
Run Code Online (Sandbox Code Playgroud)

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


pro*_*mer 7

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

import os
import logging

logging.getLogger('werkzeug').disabled = True
os.environ['WERKZEUG_RUN_MAIN'] = 'true'
Run Code Online (Sandbox Code Playgroud)

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


小智 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)
Run Code Online (Sandbox Code Playgroud)

不幸的是* Running on localhost:9151,第一次健康检查仍然打印到标准输出,但是当运行大量测试时,它会清理输出一吨.

"那log_names你为什么?",你问.在我的情况下,我需要一些额外的日志来摆脱.我能够通过以下方式找到要添加到log_names的记录器:

from flask import Flask
app = Flask(__name__)

import logging
print(logging.Logger.manager.loggerDict)
Run Code Online (Sandbox Code Playgroud)

旁注:如果有一个flaskapp.getLogger()或者其他什么东西,这样会更好,不同版本.有任何想法吗?

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

谢谢:


小智 6

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

gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)
Run Code Online (Sandbox Code Playgroud)


dai*_*ain 5

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

解决方案是通过在 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"]},
    },
}
Run Code Online (Sandbox Code Playgroud)