Tornadoを使ってみる

Logging機能


こちらに TornadoのLogging Supportのページが有りますが難しくてよく分かりません。
そこで分かる範囲でLogging機能を調べてみました。
#
# Simple Web Server
#
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        param = self.get_argument('param', 'Hello World')
        self.write(param)

if __name__ == "__main__":
    tornado.options.parse_command_line()
    #app = tornado.web.Application(handlers=[(r"/", IndexHandler)],debug=True)
    app = tornado.web.Application([(r"/", IndexHandler)],debug=True)
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

上のコードを起動すると起動画面にはこのように表示されます。


次に以下の赤字の部分を追加します。
#
# Simple Web Server
#
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import logging

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        param = self.get_argument('param', 'Hello World')
        logging.info("info param={}".format(param))
        self.write(param)

if __name__ == "__main__":
    tornado.options.parse_command_line()
    #app = tornado.web.Application(handlers=[(r"/", IndexHandler)],debug=True)
    app = tornado.web.Application([(r"/", IndexHandler)],debug=True)
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

これだけで、好きなログを追加することができます。


さらに以下の様に変更します。
#
# Simple Web Server
#
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import logging

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        param = self.get_argument('param', 'Hello World')
        logging.info("info param={}".format(param))
        logging.warning("warning param={}".format(param))
        logging.error("error param={}".format(param))
        self.write(param)

if __name__ == "__main__":
    tornado.options.parse_command_line()
    #app = tornado.web.Application(handlers=[(r"/", IndexHandler)],debug=True)
    app = tornado.web.Application([(r"/", IndexHandler)],debug=True)
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

これで、黄色と赤のログが追加されます。


起動時のオプションでログレベルを指定することができます。


日本語も問題ありません。


起動時のオプションでログをファイルに保存することができます。




pythonスクリプトの中でログレベルも指定できるはずなんですが、なぜか正しく動きません。
#
# Simple Web Server
#
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import logging

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

logging.basicConfig(level=logging.ERROR)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        param = self.get_argument('param', 'Hello World')
        #print("param={}".format(param))
        #logging.debug("debug param={}".format(param))
        logging.info("info param={}".format(param))
        logging.warning("warning param={}".format(param))
        logging.error("error param={}".format(param))
        logging.info("これはinfoです param={}".format(param))
        logging.warning("これはwarningです param={}".format(param))
        logging.error("これはerrorです param={}".format(param))
        self.write(param)

if __name__ == "__main__":
    tornado.options.parse_command_line()
    #app = tornado.web.Application(handlers=[(r"/", IndexHandler)],debug=True)
    app = tornado.web.Application([(r"/", IndexHandler)],debug=True)
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

INFOとかWARNINGも表示され、表示フォーマットも変わって、モノクロ表示になってしまいます。


ログ出力先の変更は正しく動きました。
#
# Simple Web Server
#
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import logging

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

#logging.basicConfig(level=logging.ERROR)
logging.basicConfig(filename='example.log')

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        param = self.get_argument('param', 'Hello World')
        #print("param={}".format(param))
        #logging.debug("debug param={}".format(param))
        logging.info("info param={}".format(param))
        logging.warning("warning param={}".format(param))
        logging.error("error param={}".format(param))
        logging.info("これはinfoです param={}".format(param))
        logging.warning("これはwarningです param={}".format(param))
        logging.error("これはerrorです param={}".format(param))
        self.write(param)

if __name__ == "__main__":
    tornado.options.parse_command_line()
    #app = tornado.web.Application(handlers=[(r"/", IndexHandler)],debug=True)
    app = tornado.web.Application([(r"/", IndexHandler)],debug=True)
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

$ cat example.log
INFO:root:info param=Hello World
WARNING:root:warning param=Hello World
ERROR:root:error param=Hello World
INFO:root:これはinfoです param=Hello World
WARNING:root:これはwarningです param=Hello World
ERROR:root:これはerrorです param=Hello World
INFO:tornado.access:304 GET / (192.168.10.107) 1.81ms

Tornado起動時のオプション(--log-file-prefix)で、ログ出力先は指定できるので、basicConfig()は使わな い方がいいです。



別の環境にTornadoを新規インストールしたらログの表示がモノクロになってしまいました。
Shell(bash)のlsコマンドは色付きで表示されるので、インストールされているloggingライブラリが違うようです。


Tornadoでは起動時のloggingパラメータでログレベルを指定することができます。
Pythonのログに色を付ける対応は、色々なところで公開されていますが、
起動時のloggingパラメータは使えるようにしたかったので、こ ちらで公開されているColorer.pyを追加しました。
Colorerモジュールをインポートするだけで色が付きます。


起動時のloggingパラメータも正しく動きます。


debugログの色はピンクです。


モジュール内のエスケープ文字列を変えることで好きな色に変えることができます。
debugログの色をLightCyanに変えました。
色コードの一覧はこ ちらに公開されています。

color = '\x1b[96m' # lightcyan
#color = '\x1b[35m' # pink




--log-file-prefixによるログ出力先の切り替えも正常に動きました。

続く...