5

有没有办法将 waitress-serve 输出记录到文件中?

我使用的当前命令是:

waitress-serve --listen=localhost:8080 --threads=1 my_app_api:app

我们使用的应用程序之前没有考虑到女服务员,所以我们选择使用命令行来服务它以避免更改(至少现在是这样)。

4

1 回答 1

4

TLDR waitress-serve 没有提供这样做的方法。请参阅“我如何将其记录”部分。

背景

根据 waitress-serve 命令行使用的文档,不 - 无法设置日志记录。请参阅参数文档

waitress-serve只是一个可执行文件,可让您更方便地运行您的服务器。它的源代码在这里runner.py。如果您阅读它,您会发现它实际上只是在呼唤from waitress import serve; serve(**args)您。(那个代码片段并不是字面上它在做什么,但在精神上是的)。

服务员的文档说它不记录 http 流量。那不是它的工作。但它会记录它自己的错误或堆栈跟踪。记录文档。如果您阅读服务员源试图查找它何时记录内容,您会注意到它似乎没有在任何地方记录 http 流量github log search。它主要记录与套接字层有关的内容。

女服务员确实说过,如果你想记录 http 流量,那么你需要另一个组件。特别是,它指向pasteedeploy 文档,这是一些可以为您记录 http 流量的中间件。

来自女服务员的文档实际上有助于回答您的问题,尽管不是直接和明确的。它说

WSGI 设计是模块化的。

根据日志记录文档

即女服务员不会为您记录http 流量。您将需要另一个 WSGI 组件来执行此操作,并且由于 WSGI 是模块化的,您可能可以选择一些东西。

如果你想了解它是如何工作的,这里有一篇很好的帖子leftasexercise.com

好的,我如何让它登录?

使用三通

基本上,如果您只想记录输出的相同内容,waitress-serve那么您不需要任何特别的东西。

waitress-serve --listen=localhost:8080 --threads=1 my_app_api:app | tee -a waitress-serve.log

Python 日志记录

但是,如果您实际上正在寻找来自 python 标准记录器的日志记录(例如,您的应用程序正在进行记录器调用或者您想要记录 http 流量),那么您可以在您的 python 应用程序代码中进行设置。例如编辑您的应用程序源代码并让它设置日志记录到文件

import logging
logging.basicConfig(filename='app.log', encoding='utf-8', level=logging.DEBUG)

用于 http 日志的 PasteDeploy 中间件

或者,如果您正在寻找 apache 类型的 http 日志记录,那么您可以使用 PasteDeploy 之类的东西来完成它。请注意,PasteDeploy 是另一个 python 依赖项,因此您需要安装它。例如

pip install PasteDeploy

然后你需要设置一个.ini文件,告诉 PasteDeploy 如何启动你的服务器,然后告诉它使用 TransLogger 创建 apache 类型的 http 日志。此处对此进行了更详细的解释,使用 pasteedeploy 进行日志记录 ini 文件特定于每个应用程序,但从您的问题来看,ini 文件应该如下所示:

[app:wsgiapp]
use = my_app_api:app

[server:main]
use = egg:waitress#main
host = 127.0.0.1
port = 8080

[filter:translogger]
use = egg:Paste#translogger
setup_console_handler = False

[pipeline:main]
pipeline = translogger
           app

您仍然需要编辑应用程序的源代码,以让 PasteDeploy 使用您的配置文件加载应用程序:

from paste.deploy import loadapp
wsgi_app = loadapp('config:/path/to/config.ini')

依赖于 Web 框架的滚动你自己的 http 日志记录

即使您想记录 http 流量,也不一定需要 PasteDeploy 之类的东西。例如,如果您使用 flask 作为 web 框架,您可以使用after_request装饰器编写自己的 http 日志:

@app.after_request
def after_request(response):
     timestamp = strftime('[%Y-%b-%d %H:%M]')
     logger.error('%s %s %s %s %s %s', timestamp, request.remote_addr, request.method, request.scheme, request.full_path, response.status)
     return response

请参阅https://gist.github.com/alexaleluia12/e40f1dfa4ce598c2e958611f67d28966上的完整要点

于 2020-12-11T12:34:18.083 回答