gpt4 book ai didi

python - 当 FLASK_ENV=development 时,Werkzeug 不记录 HTTP 请求

转载 作者:行者123 更新时间:2023-12-05 06:54:36 27 4
gpt4 key购买 nike

我正在开发一个简单的 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 -

主要问题可能来 self 的 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,这意味着我可以通过使用 log.info() 等来创建日志create_app() 或其他模块。

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

Basic Configuration
When you want to configure logging for your project, you should do it as soon as possible when the program starts. If app.logger is accessed before logging is configured, it will add a default handler. If possible, configure logging before creating the application object.

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

最佳答案

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

  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 的日志。在生产中,此日志以所需的方式配置,但在开发中,它只是一个普通的打印。之后,日志记录没有区别。

关于python - 当 FLASK_ENV=development 时,Werkzeug 不记录 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65508074/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com