使用命令行女服务员记录日志

时间:2018-09-17 16:30:38

标签: python python-3.x logging wsgi waitress

是否有一种方法可以将女服务生的输出记录到文件中?

我当前使用的命令是:

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

我们以前使用的应用程序并不是在为女服务员编写的,所以我们选择使用命令行来提供服务,以避免更改(至少目前如此)。

1 个答案:

答案 0 :(得分:0)

TLDR 服务生提供的方法无法提供。请参阅“如何记录”部分。

背景

根据文档中关于女服务员的命令行用法,否-无法设置日志记录。参见arguments docs

waitress-serve只是一个可执行文件,可以使您的服务器运行更加方便。它的源代码在这里runner.py。如果您阅读它,可以看到它实际上实际上只是为您呼叫from waitress import serve; serve(**args)。 (该代码剪辑实际上并不是在做什么,但从本质上讲是这样)。

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

女服务员确实说,如果您想记录http流量,则您需要另一个组件。特别是,它指向pastedeploy docs,这是一些中间件,可以为您记录http流量。

女服务员提供的文档实际上对回答您的问题很有帮助,尽管不是直接和明确的。它说

WSGI设计是模块化的。

根据logging doc

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

如果您想了解它的工作原理,请在leftasexercise.com

上发表一篇不错的文章

好,如何获取日志?

使用tee

基本上,如果您只想记录从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 logging,则可以使用PasteDeploy之类的方法来执行。注意,PasteDeploy是另一个python依赖项,因此您需要安装它。例如

pip install PasteDeploy

然后,您需要设置一个.ini文件,该文件告诉PasteDeploy如何启动服务器,然后还告诉它使用TransLogger创建apache类型的http日志。 logging with pastedeploy对此ini文件进行了详细说明,但每个问题都来自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')

依赖于Webframework的自己的http日志记录

即使您想记录HTTP流量,也不一定需要PasteDeploy之类的东西。例如,如果您使用flask作为网络框架,则可以使用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

相关问题