【问题标题】:Python, Flask print to console and log file simultaneouslyPython,Flask 同时打印到控制台和日志文件
【发布时间】:2020-03-17 22:34:51
【问题描述】:

我使用的是 python 3.7.3,flask 版本是 1.0.2。

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

import logging
logging.basicConfig(filename='api.log',level=logging.DEBUG)

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

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

app.run(host='0.0.0.0', port=80, debug=True)

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

【问题讨论】:

    标签: python-3.x logging flask console


    【解决方案1】:

    找到解决办法:

    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)
    

    其他例子:

    # 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)
    

    来源: 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 -
    

    这是因为 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) 
    

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

    【讨论】:

    • 男人!你为我节省了很多时间,非常感谢。关于 werkzeug 的那部分非常有帮助!
    【解决方案2】:

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

    要让内置记录器写入文件,您必须向记录器添加logging.FileHandler。在app.run 中设置debug=True 会启动开发服务器,但不会将日志级别更改为调试。因此,您需要手动将日志级别设置为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)
    

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

    【讨论】:

    • 我将我的代码从使用 logging.basicConfig() 重构为您的建议。 IP/日期/HTTP 请求信息已返回到控制台(万岁!),但唯一记录的信息是传递给 app.logger.error/warning/info/debug 函数的文本。有没有办法将 HTTP 调用也记录到日志文件中?
    • 我正在查看您链接的文档的“注入请求信息”部分。这可能会解决这个问题。
    • 很遗憾没有。虽然请求信息正确发布到控制台,但它从日志中被忽略了。看我上面的回答。事实证明,您需要允许 WSGI 底层记录器访问日志文件,然后它实现控制台发布和日志文件条目。
    猜你喜欢
    • 2018-11-28
    • 2016-04-28
    • 2015-10-28
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多