« Back to Index

Python: tornado logging when request has completed

View original Gist on GitHub

Tags: #python #logs

tornado logging when request has completed.py

"""
That Application.log_request approach uses very explicit naming, 
and yet the tornado docs for RequestHandler.on_finish says...

> Override this method to perform cleanup, logging, etc.

So there’s two ways to essentially do the same thing 🤔

My understanding for the difference would be log_request is useful for 
generic logging behaviour, while on_finish could be customized per 
request handler.

NOTE: log_request completes first, then on_finish
"""

import asyncio

import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):
    def initialize(self, *args, **kwargs):
        print("initialize:", args, kwargs)

    def prepare(self):
        self.ctx = {}
        print("prepare:", self.ctx)

    async def get(self):
        self.write("Hello, world")
        self.ctx["abc"] = 123
        await asyncio.sleep(2)
        print("get:", self.ctx)

    def on_finish(self):
        self.ctx["xyz"] = 456
        print("finish:", self.ctx)


def make_app():
    class App(tornado.web.Application):
		"""subclass tornado web application so we can override log_request.
        
        DOCUMENTATION:
        https://www.tornadoweb.org/en/stable/web.html#tornado.web.Application.log_request
        """
        
        def log_request(self, handler: tornado.web.RequestHandler) -> None:
            print("log stuff")

    # return tornado.web.Application([
    #     (r'/', MainHandler, {"beep": 123, "boop": 456}),
    # ])

    return App([
        (r'/', MainHandler, {"beep": 123, "boop": 456}),
    ])


if __name__ == '__main__':
    app = make_app()
    app.listen(9000)
    tornado.ioloop.IOLoop.current().start()