python - 使用命令行 waitress-serve 进行日志记录

标签 python python-3.x logging wsgi waitress

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

我使用的当前命令是:

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

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

最佳答案

TLDR waitress-serve 没有提供这样做的方法。请参阅“我如何将其记录”部分。
背景
根据 waitress-serve 命令行使用的文档,不 - 无法设置日志记录。见 arguments docs .waitress-serve只是一个可执行文件,可让您更方便地运行您的服务器。它的源代码在这里runner.py .如果您阅读它,您会发现它实际上只是调用 from waitress import serve; serve(**args)为你。 (那个代码片段并不是字面上它在做什么,但在精神上是的)。
服务员的文档说它不记录 http 流量。那不是它的工作。但它会记录它自己的错误或堆栈跟踪。 logging docs .如果您阅读服务员源试图查找它何时记录内容,您会注意到它似乎没有在任何地方记录 http 流量 github log search .它主要记录与套接字层有关的内容。
女服务员确实说过,如果您想记录 http 流量,那么您需要另一个组件。特别是,它指向 pastedeploy docs这是一些可以为您记录 http 流量的中间件。
来自女服务员的文档实际上有助于回答您的问题,尽管不是直接和明确的。它说

The WSGI design is modular.


根据 logging doc
IE。女服务员不会为您记录 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 日志。这在此处进行了更详细的解释logging with pastedeploy 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 上查看完整要点

关于python - 使用命令行 waitress-serve 进行日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52372187/

相关文章:

python - 变量的目录 raw_input

Python - 删除多维数组中的项目

Python Kafka 客户端 - 没有错误但无法正常工作

java - Log4j2 在 appender 中过滤特定级别

python - 何时删除用户 session

c++ - 我应该如何对代码生成器进行单元测试?

python - 如何在 python 3 中使用 cookie?

python - 如何处理大量小部件的 QPropertyAnimation

Java 日志记录似乎不适用于 FINE/FINER/FINEST 级别

go - 生产中的 log.SetFlags(log.LstdFlags | log.Lshortfile)