如何使用“gevent.pywsgi.WSGIServer”和“WebSocketHandler”启用 Flask 应用程序的日志记录?

How to enable logging of Flask app with `gevent.pywsgi.WSGIServer` and `WebSocketHandler`?

使用以下两个最小示例应该可以重现该问题:

app.run()

的最小示例
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return 'Hello'

app.run()

gevent.pywsgi.WSGIServer

的最小示例
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return 'Hello'

from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler
server = pywsgi.WSGIServer(('127.0.0.1', 5000), app, handler_class=WebSocketHandler)
server.serve_forever()

前 5 行相同,因此两个示例仅在启动服务器的方式上有所不同。两个服务器都工作,我在浏览器中得到 "Hello"。第一个示例打印:

 * Serving Flask app "1" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [20/Jun/2019 23:43:15] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [20/Jun/2019 23:43:19] "GET / HTTP/1.1" 200 -

因此控制台输出显示有关服务器处理的每个请求的一些信息。

但是,对于第二个示例,我不再在控制台中获得任何日志记录输出。如何为 gevent.pywsgi.WSGIServerWebSocketHandler 启用日志记录?


背景(我认为这与问题无关)

我是 运行 一个使用 flask_sockets 的 Flask 应用程序。因为

Werkzeug development server cannot provide the WSGI environ with a websocket interface

我无法通过 app.run() 使用服务器,我正在使用 gevent.pywsgi.WSGIServer。我上面示例的代码直接取自 https://github.com/heroku-python/flask-sockets 的模块示例,没有任何修改。

应该那样工作,但它是 geventwebsocket 模块中 WebSocketHandler 中的一个错误,该错误已被报告:https://gitlab.com/noppo/gevent-websocket/issues/16

日志记录与 gevent.pywsgi.WSGIServer 的工作方式不同。它使用 python logging 并且更加复杂和灵活。

这是一个例子:

from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler

import logging
logging.basicConfig(level=logging.INFO)

server = pywsgi.WSGIServer(('127.0.0.1', 5000), app, handler_class=WebSocketHandler)
server.serve_forever() 

现在无论你想输出到哪里,你都可以:

logging.info("You can see me now...")   

如果你想从 WSGIServer 查看启动信息,那么将日志级别设置为 DEBUG,你可以看到大量的输出。