LTSVをNginxで使ってみる

id:stanakaLTSVがバズってるみたいなので乗ってみた。(Hacker Newsにもポストしたんだけど、瞬時に流れてしまったよ。。)

Nginxでの設定を(主にキーの命名で)1時間ぐらい試行錯誤した結果、とりあえず以下に落ち着いた。

log_format ltsv 'ts:$time_iso8601\t'
                'ip:$remote_addr\t'
                'method:$request_method\t'
                'path:$request_uri\t'
                'status:$status\t'
                'size_req:$request_length\t'
                'size_res:$bytes_sent\t'
                'size_body:$body_bytes_sent\t'
                'time_req:$request_time\t'
                'time_app:$upstream_response_time\t'
                # 'scheme:$scheme\t'
                # 'protocol:$server_protocol\t'
                # 'referer:$http_referer'
                # 'host:$host\t'
                'ua:$http_user_agent\t';

まず、nginx.conf内での記述を思い切って1行1アイテムで記述してみたら、これが快適。行単位で順番を並べ替えたり一部をコメントアウトしたり、試行錯誤するのがとても簡単。可読性も高い。

新プロジェクトで使うこのサーバはiOS / Androidアプリから叩くAPI専用なので、refererとかいらないや、とか、hostはSSLのホストに決まっているだろ!的なのは、はずしちゃう。でも将来使うかもしれない項目はとりあえずコメントアウトした状態で入れておけば、変数名忘れてリファレンス見に行く必要もないので便利!

あと、必ず使う項目のキーは短くしたいので、タイムスタンプはtsにしておいて(tsを他の用途で使うこともないだろうし)、requestとresponseの省略形をreqとresに統一して、elapsed系の秒数をtimeプレフィックスにして、大項目から少項目へはアンダースコアでつないで。。。ってオレオレルールでキー名を決めてみた。

あと、tail -fでログみるときには

tail -f access.log | cut -f 1-4,6

みたいにして表示するフィールドを選択できるけど、

tail -f access.log | cut -f 1-4,6 | sed 's/\t/ /g'

でタブをスペース1個に置換しようとしたら出力されなかった。これどうすりゃいいんだろ?あとで調べよう。

そういえばRailsのログを行志向に変えてくれるlogrageってのもあったけど、あれはキーと値のカップリングに:ではなく=を使ってて、区切りはスペースだった。=もスペースもよく値に登場するので、WebサーバのログのフォーマットとしてはLTSVのほうがいいね。

追記

id:antipopから指摘をうけてreq:$requestをやめてmethod:$request_methodpath:$request_uriなどに分解しました。たしかにリクエストラインそのまま記録する意味はないですね!