【问题标题】:When FLASK_ENV=development, Werkzeug does not log HTTP requests当 FLASK_ENV=development 时,Werkzeug 不记录 HTTP 请求
【发布时间】:2020-12-30 13:52:00
【问题描述】:

我正在开发一个简单的 Flask-RESTful API,我对它非常陌生,并且遇到了一些日志记录问题。

使用export FLASK_ENV=development,Werkzeug 记录器不会记录任何 HTTP 请求,例如 GET、POST 等。 当export FLASK_ENV=production一切正常时,几个简单的日志可以是这样的:

2020-12-30 14:01:03,723 | INFO | werkzeug | 127.0.0.1 - - [30/Dec/2020 14:01:03] "GET /list/2 HTTP/1.1" 200 -
2020-12-30 14:01:03,742 | INFO | werkzeug | 127.0.0.1 - - [30/Dec/2020 14:01:03] "PUT /list/2 HTTP/1.1" 201 -
2020-12-30 14:01:03,749 | INFO | werkzeug | 127.0.0.1 - - [30/Dec/2020 14:01:03] "DELETE /list/2 HTTP/1.1" 204 -

主要问题可能来自我的logger.py 中的logging.dictConfig,因为使用简单的logging.basicConfig 会正常创建日志。我的logger.py 看起来像这样:

import logging as log
from logger.config import dictConfig

dictConfig(
    {
        "version": 1,
        "formatters": {
            "precise": {
                "format": "%(asctime)s | %(levelname)s | %(name)s | %(module)s | %(message)s"
            },
            "brief": {"format": "%(asctime)s | %(levelname)s | %(message)s"},
        },
        "handlers": {
            "console": {
                "class": "logging.StreamHandler",
                "stream": "ext://sys.stdout",
                "formatter": "brief",
                "level": "WARNING",
            },
            "file": {
                "class": "logging.handlers.RotatingFileHandler",
                "formatter": "precise",
                "filename": "logs/api.log",
                "maxBytes": 1024 ** 2,
                "backupCount": 1,
            },
        },
        "root": {"level": "DEBUG", "handlers": ["console", "file"]},
    }
)

在我的__init__.py中我导入log,这意味着我可以在create_app()或其他模块中使用log.info()等创建日志。

但是,根据Flask文档(https://flask.palletsprojects.com/en/1.1.x/logging/),也可能是我的配置时间问题造成的:

基本配置
当您想为您的项目配置日志记录时,您应该在程序启动时尽快进行。如果在配置日志记录之前访问app.logger,它将添加一个默认处理程序。如果可能,请在创建应用程序对象之前配置日志记录。

export FLASK_ENV=development 时,我确实注意到 Werkzeug 在我的任何日志之前记录了一些内容。我很惊讶这可能是这种情况,因为使用logging.basicConfig 来配置它,它就像一个魅力。而我在__init__.py 做的第一件事就是导入记录器;这意味着我真的不能再早点这样做了..

【问题讨论】:

    标签: python flask logging flask-restful


    【解决方案1】:

    我刚刚遇到了同样的问题,在尝试解决它时,我发现了一个不太理想但可行的解决方案。

    1. 安装包logging_tree。使用logging_tree.printout() 打印完整的日志树。
    2. 对我来说,生产环境记录器 "werkzeug" 具有所需的配置,但在开发环境中,相同的记录器没有配置,导致缺少日志记录。
    3. 要解决此问题,请将"werkzeug" 记录器添加到dictConfig 中的记录器中

    我的dictConfig

    logging_config = dict(
        version=1,
        formatters={
            "file": {"format": LOG_DETAILED_FORMAT},
            "simple_console": {
                "()": "coloredlogs.ColoredFormatter",
                "format": LOG_SIMPLE_FORMAT,
            },
        },
        handlers={
            "server_console": {
                "level": logging.INFO,
                "class": "logging.StreamHandler",
                "formatter": "simple_console",
            },
            "file": {
                "level": logging.WARNING,
                "class": "logging.handlers.RotatingFileHandler",
                "filename": LOG_FILE_NAME,
                "formatter": "file",
                "maxBytes": 1024 * 1024 * 100,  # ~100 MB
                "backupCount": 10,
            }
        },
        loggers={
            "": {  # Root logger
                "handlers": ["server_console", "file"],
                "level": logging.INFO,
                "propagate": False,
            },
            "werkzeug": {  # Flask
                "handlers": ["server_console", "file"],
                "level": logging.INFO,
                "propagate": False,
            },
        },
    )
    

    在调整之后,我可以看到生产和开发日志记录之间的唯一区别是第一个关于运行它的服务器 IP 的日志。在生产中,此日志以所需的方式配置,但在开发中,它只是一个正常的打印。之后,日志记录就没有区别了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      相关资源
      最近更新 更多