Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

The issue should be reproducible with the following two minimal examples:

Minimal example with app.run()

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return 'Hello'

app.run()

Minimal example with 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()

The first 5 lines are identical, so both examples only differ in the way they start the server. Both servers do work, I get "Hello" in the browser. The first example prints:

 * 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 -

So the console output shows some information about every request which is handled by the server.

However, with the second example, I don't get any logging output in the console anymore. How do I enable logging for gevent.pywsgi.WSGIServer and WebSocketHandler?


Background (which doesn't matter regarding the issue, I think)

I'm running a Flask app which uses flask_sockets. Because

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

I am not able to use the server with app.run() and I'm using gevent.pywsgi.WSGIServer instead. The code of my example above is taken directly from the module's examples at https://github.com/heroku-python/flask-sockets without any modifications.

like image 738
finefoot Avatar asked Jun 20 '19 21:06

finefoot


People also ask

Does flask use gevent?

The charming gevent library will enable you to keep using Flask while start benefiting from all the I/O being asynchronous.

What is gevent Pywsgi?

pywsgi – A pure-Python, gevent-friendly WSGI server. A pure-Python, gevent-friendly WSGI server. The server is provided in WSGIServer , but most of the actual WSGI work is handled by WSGIHandler — a new instance is created for each request.

What is gevent flask?

gevent allows writing asynchronous, coroutine-based code that looks like standard synchronous Python. It uses greenlet to enable task switching without writing async/await or using asyncio . eventlet is another library that does the same thing.


1 Answers

Logging works differently with gevent.pywsgi.WSGIServer. It uses python logging and is much more sophisticated and flexible.

Here's an example:

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() 

And now wherever you want output, you can do:

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

If you want to see startup info from WSGIServer, then set the log level to DEBUG and you can see tons of output.

like image 90
BooTooMany Avatar answered Oct 25 '22 11:10

BooTooMany