Python、Flask 同时打印到控制台和日志文件

rjk*_*nde 2 console logging flask python-3.x

我正在使用 python 3.7.3,flask 版本为 1.0.2。

在没有以下导入的情况下运行我的 app.py 文件时:

import logging
logging.basicConfig(filename='api.log',level=logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)

Flask 将向控制台显示相关的调试信息,例如 POST/GET 请求以及它们来自哪个 IP。

一旦启用调试日志记录,我就不再收到此输出。我尝试在调试模式下运行我的应用程序:

app.run(host='0.0.0.0', port=80, debug=True)
Run Code Online (Sandbox Code Playgroud)

但这会产生相同的结果。有没有办法同时启用控制台输出和 python 日志记录?这听起来像是一个愚蠢的请求,但我想将控制台用于演示目的,同时提供日志文件以进行故障排除。

akr*_*ntz 6

Flask 有一个内置的记录器,可以使用app.logger. 它只是标准库logging.Logger类的一个实例,这意味着您可以像通常使用基本记录器一样使用它。它的文档在这里

要让内置记录器写入文件,您必须向logging.FileHandler记录器添加一个。设置debug=Trueapp.run,启动开发服务器,但不改变日志级别调试。因此,您需要logging.DEBUG手动将日志级别设置为。

例子:

import logging
from flask import Flask

app = Flask(__name__)

handler = logging.FileHandler("test.log")  # Create the file logger
app.logger.addHandler(handler)             # Add it to the built-in logger
app.logger.setLevel(logging.DEBUG)         # Set the log level to debug

@app.route("/")
def index():
    app.logger.error("Something has gone very wrong")
    app.logger.warning("You've been warned")
    app.logger.info("Here's some info")
    app.logger.debug("Meaningless debug information")
    return "Hello World"

app.run(host="127.0.0.1", port=8080)
Run Code Online (Sandbox Code Playgroud)

如果然后查看日志文件,它应该打印出所有 4 行,并且控制台也将包含这些行。


rjk*_*nde 6

找到了解决办法:

import logging
from flask import Flask

app = Flask(__name__)

logger = logging.getLogger('werkzeug') # grabs underlying WSGI logger
handler = logging.FileHandler('test.log') # creates handler for the log file
logger.addHandler(handler) # adds handler to the werkzeug WSGI logger

@app.route("/")
def index():
    logger.info("Here's some info")
    return "Hello World"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)
Run Code Online (Sandbox Code Playgroud)

其他例子:

# logs to console, and log file
logger.info("Some text for console and log file")

# prints exception, and logs to file
except Exception as ue:
        logger.error("Unexpected Error: malformed JSON in POST request, check key/value pair at: ")
        logger.error(ue)
Run Code Online (Sandbox Code Playgroud)

来源:https : //docstrings.wordpress.com/2014/04/19/flask-access-log-write-requests-to-file/

如果链接损坏:

您可能会感到困惑,因为向 Flask 的 app.logger 添加处理程序不会捕获您在控制台中看到的输出,例如:

127.0.0.1 - - [19/Apr/2014 18:51:26] "GET / HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud)

这是因为 app.logger 适用于 Flask,并且输出来自底层 WSGI 模块 Werkzeug。

要访问 Werkzeug 的记录器,我们必须调用 logging.getLogger() 并为其指定 Werkzeug 使用的名称。这允许我们使用以下方式将请求记录到访问日志:

logger = logging.getLogger('werkzeug')
handler = logging.FileHandler('access.log')
logger.addHandler(handler)

# Also add the handler to Flask's logger for cases
#  where Werkzeug isn't used as the underlying WSGI server.
#  This wasn't required in my case, but can be uncommented as needed
#  app.logger.addHandler(handler) 
Run Code Online (Sandbox Code Playgroud)

您当然可以添加自己的格式和其他处理程序。