如何使用“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.WSGIServer
和 WebSocketHandler
启用日志记录?
背景(我认为这与问题无关)
我是 运行 一个使用 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,你可以看到大量的输出。
使用以下两个最小示例应该可以重现该问题:
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.WSGIServer
和 WebSocketHandler
启用日志记录?
背景(我认为这与问题无关)
我是 运行 一个使用 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,你可以看到大量的输出。