LoginSignup
3
3

More than 5 years have passed since last update.

Tornado.logに自分のアプリケーションのログを出す方法

Last updated at Posted at 2018-10-27

結論:

自分のアプリケーションのハンドラで app_log() を使う

tornado.log.app_log の import

自分のアプリケーションのハンドラで tornado.log.app_log を import します。こんなかんじです

from tornado.log import app_log

Tornado のドキュメントには、

Tornado uses three logger streams:
・ tornado.access:
・ tornado.application:
・ tornado.general:

とあるのですが、その tornado.application をどうやって使ったらいいのかの記載を見つけられません
そこで、tornado のソースコードみると

# Logger objects for internal tornado use
access_log = logging.getLogger("tornado.access")
app_log = logging.getLogger("tornado.application")
gen_log = logging.getLogger("tornado.general")

と、app_log普通にLogerとして用意されてるのでこれを import します。まさにこれがわからなくて3時間もハマってしまいました ^^;;;

あとはこんなふうに、ログをいれると

    def auth_confirm(self, id, token):
        app_log.info("auth_confirm:")
        app_log.info("id =  %s", id)
        app_log.info("token = %s", token)
        return True

こんなふうにtornado のログ・ファイルに混ぜて出力してくれます

ueda@scw-app1:~/rhizosphere$ cat /var/log/rhizosphere 
[D 181027 10:31:01 selector_events:53] Using selector: EpollSelector
[I 181027 10:31:02 web:2106] 101 GET /device (123.218.210.70) 3.08ms
[I 181027 10:31:02 sample_client_device_pair:60] open:
[I 181027 10:31:02 sample_client_device_pair:54] auth_confirm:
[I 181027 10:31:02 sample_client_device_pair:55] id =  0000000009f479d8
[I 181027 10:31:02 sample_client_device_pair:56] token = True
[I 181027 10:31:02 sample_client_device_pair:69] register id =  0000000009f479d8
[I 181027 10:31:02 sample_client_device_pair:77] on_message: message =  {"command": "register", "id": "0000000009f479d8"}

関係ないですが、ここで定義してる auth_confirm って、名前に反して全然 confirm してないですね ^^;;;

参考: tornado 自身のログをファイル出力にする方法

ちなみに、あたりまえなのですが tornado 自身のログ出力が有効になっていなければいくら app_log() を使っても、そもそもそれが出力される先がありません。Nginx や Apache なんかとちがって、tornado はデフォルトではログを出力しないので、こちらも設定する必要があります

それにつきましては @fukkyy様がこちらですでに投稿されてますように、実行時に log_file_prefix オプションで出力先ファイルのパスを指定しさえすれば、そちらに出力されます。ログレベルの指定も logging オプションで可能です

とはいえ、これらのオプションを指定する手段を用意してあげないと指定ができないので、tornado.option を使います

tornado.options.options の import

mainこんなかんじで tornado.options.options を import します

from tornado.options import define, options

単に log をファイルに出力するだけで良くて、自分でコマンドライン(及び設定ファイル)オプションを追加しないのであれば、parse_config_file はデフォルトで define 済なので define は import しなくてもいいです

from tornado.options import options

main に option の parse を用意

tornado.options は ものすごく便利で、これで define したオプションは実行時にこんなふうに parse_command_line でコマンドラインから受け取ることも、

options.parse_command_line()

こんなふうにparse_config_fileで設定ファイルから受け取ることも、

if options.config_file:
    options.parse_config_file(options.config_file)

2つとも用意しておいて両方から受け取ることもできます。これだけのためにでもサーバに関係ないアプリでも tornado.option 使いたいぐらいです

実行時にコマンドラインか設定ファイルで parse_config_file を指定

あとは@fukkyy様がこちらに投稿されてますようにコマンドラインで指定するか、このように 設定ファイルで指定するかして、log_file_prefile を指定します

経緯

掲題の件、どうするんだろうと思ってまず教科書をみてみたのですが、tornado の教科書って 2012年の本しかなくて、その頃はそもそも tornado.log がまだありません

なので、ドキュメントを見るんですが、tornado.application とか、ちゃんと application のログを出す feature を用意してくれてるみたいなんですけど、どうやって使うのか、フレームワークがわかる記載を見つけられない

で、tornado.log application tutorial とかで検索するも、なぜか tornado.log とは別に logging でログ出してる tutorial ばっかり見つかり

諦めて普段はまず読まない(それが悪いんですが ^^;;;)tornado ソースコードを log で検索して眺めてみると、なんか普通に内部で logging 使ってるだけだな、app_logすればログでるのかな?、って見当がついてきたので試してみたら正解でした

注意

当たり前ですけど tornado 自身のログって tornado のアプリケーションの中でないと 有効じゃないので、たとえば こんなふうに tornado の外 で app_log してみても黙って無視されるだけで、エラーにもなりません。
思慮深い諸兄諸姉には蛇足でしかない注意喚起かもしれませんが、軽率な私はやってしまい、しばらく悩みました...

結び

本稿はこちらでカジュアルに発表させていただきました発表を加筆修正してこちらに投稿させていただきました次第です
経緯に書きましたとおり、tornado が用意するオブジェクトをつかってアプリケーションログを出力する tutorial や sample code が意外と見つけられなかったため、同じように悩まれている方の参考になればと思い投稿させていただきましたのですが、私の誤認識、誤解、誤記などございましたらご奇譚のないご指摘をいただければ幸いです

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3