有没有办法将 waitress-serve 输出记录到文件中?
我使用的当前命令是:
waitress-serve --listen=localhost:8080 --threads=1 my_app_api:app
我们使用的应用程序之前没有考虑到女服务员,所以我们选择使用命令行来服务它以避免更改(至少现在是这样)。
有没有办法将 waitress-serve 输出记录到文件中?
我使用的当前命令是:
waitress-serve --listen=localhost:8080 --threads=1 my_app_api:app
我们使用的应用程序之前没有考虑到女服务员,所以我们选择使用命令行来服务它以避免更改(至少现在是这样)。
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 标准记录器的日志记录(例如,您的应用程序正在进行记录器调用或者您想要记录 http 流量),那么您可以在您的 python 应用程序代码中进行设置。例如编辑您的应用程序源代码并让它设置日志记录到文件
import logging
logging.basicConfig(filename='app.log', encoding='utf-8', level=logging.DEBUG)
或者,如果您正在寻找 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')
即使您想记录 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上的完整要点