当FLASK_ENV=开发时,Werkzeug不记录HTTP请求



我正在开发一个简单的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中做的第一件事是导入记录器;意思是我真的不能早点做了。。

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

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

最新更新