【问题标题】:Why Flask writes logs into my logging log?为什么 Flask 将日志写入我的日志记录?
【发布时间】:2020-08-16 07:32:51
【问题描述】:

我正在创建简单的应用程序,我在烧瓶中以调试模式运行。 我决定用日志来写日志。

    import logging
    dlog = logging
    dlog.basicConfig(filename='app.log', format='%(asctime)s %(message)s',
                     datefmt='[%Y-%m-%d | %H:%M:%S]', level=logging.INFO)
    ...
if __name__ == '__main__':
    app.run(debug=True, host='localhost', port='8002')

但我发现在 app.log 中(我的应用程序不称为“app.py”)除了我的之外,Flask 还会编写自己的日志。 喜欢:

[2020-05-01 | 21:36:04]  * Running on http://localhost:8002/ (Press CTRL+C to quit)
[2020-05-01 | 21:36:04]  * Restarting with stat
[2020-05-01 | 21:36:05]  * Debugger is active!
[2020-05-01 | 21:36:05]  * Debugger PIN: 290-968-029
[2020-05-01 | 21:36:15] 127.0.0.1 - - [01/May/2020 21:36:15] "[37mGET / HTTP/1.1[0m" 200 -
[2020-05-01 | 21:36:15] 127.0.0.1 - - [01/May/2020 21:36:15] "[36mGET /static/js/main.js HTTP/1.1[0m" 304 -

为什么会发生这种情况,如何将烧瓶日志与我自己的分开?

【问题讨论】:

    标签: python python-3.x flask logging


    【解决方案1】:

    这是因为logging.basicConfig 配置了根记录器。所有创建的记录器propagate log messages to their parents 除非明确告知不要这样做:

    app.logger.propagate = False
    

    禁用记录器也是一种选择:

    app.logger.disabled = True
    

    或设置不太详细的模式

    app.logger.setLevel(logging.WARNING)
    

    仅将烧瓶日志记录到另一个文件更复杂。您必须手动删除StreamHandler 并创建FileHandler 和Formatter。 logging 模块为您提供了很大的灵活性,但可能很麻烦:

    # https://docs.python.org/3/library/logging.html#logrecord-attributes
    formatter = logging.Formatter("{asctime:s} {name} [{levelname}] {filename}:{lineno} {msg}", style="{")
    file_handler = logging.FileHandler("flask.log")
    file_handler.setFormatter(formatter)
    # set log level threshold for this handler
    file_handler.setLevel(logging.INFO)
    # flask creates StreamHandler for you, if you don't want that
    # just set handlers to empty list
    app.logger.handlers = []
    app.logger.addHandler(file_handler)
    # set log level on the flask logger
    app.logger.setLevel(logging.INFO)
    # don't propagate to parent logger (logging.root) to not duplicate
    # the logs if you're handling log messages in root logger
    app.logger.propagate = False
    
    app.logger.info("spanish iniquisition")
    
    # flask.log:
    # 2020-05-02 09:12:31,631 t [INFO] t.py:16 spanish iniquisition
    

    【讨论】:

    • 谢谢,但老实说我还是不明白如何分离日志。例如,如果我想在“flask.log”中写入烧瓶日志,在“mylog.log”中写入我的工作流程,我如何将烧瓶日志重定向到另一个日志文件?
    • 您的回答很有帮助,但没有解决问题。然而,这也是关于我不正确的问题。因为我发现我的 wsgi 日志有问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 2019-12-08
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    相关资源
    最近更新 更多