Flaskでltsv形式のログを出してみた.
前置き
最近,いろいろな問題に直面して,ログの重要性を実感しました.そのため,複数のサーバに分散したログを収集する試みを行っています.
その際使用しているのがfluentdです.
fluentdの説明は割愛しますが,以下の記事が参考になると思います.
実運用上では,アプリケーションからファイルへ出力されるログをfluentでtailして収集することが多いと思います.
その際,ログを正規表現でパースしてあげる必要があるのですが,組み込みのフォーマットであれば,正規表現を書く必要がありません.
この組み込みフォーマットには以下のものが有ります.(参考: fluentd/lib/fluent/parser.rb - Githubより)
この中でアプリケーションで利用することを考えると,json
tsv
ltsv
csv
に絞られます.
ltsv
形式は,かなり新しい形式らしく,tsv
にkeyをつけたものらしいです.
LTSV FAQ - LTSV って何? どういうところが良いの?を参考にするといいと思います.
fluentdはログをJSON形式で保持します.上記の4つの中で,key-value形式になっているものはjson
とltsv
です.
tsv
csv
はkeyを持たないため,fluentdの設定で,tailしてきた内容に対して,keyを割り当てなければなりません.
この際問題になるのが,ひとつのログファイルで一貫して同じ形式のログを出力しなければならないことです.ログの要素数を可変にしたい場合にはこれらは向きません.
残るは.json
とltsv
です.これらは.ログの効果としては同じ能力を持っていると言えます.(多分)
この際の選択基準として.
汎用性を選ぶなら
json
生ログの可読性を選ぶなら
ltsv
かなと思います.
今回は,fluentdの運用をうまくできるか不安だったので,生ログでも見やすいltsv
を選択しました.
本題
で.本題ですが,Flaskでltsvのログを出力しているサンプルが見当たらなかったので.作りました.とはいっても,通常のPython loggingと同じですね.
出力:
time:2013-12-04 01:17:34,780 level:ERROR method:hello_world message:distance value:44
fluentdに読ませつつ.要素数が可変で,可読性を取っておきたいならltsvはいいんじゃないかなと思います.
ちなみに,ltsvでログを取って,fluentd + elasticsearch + Kibana3 の運用もしているので,時間があれば書きたいなぁ.
(追記)
このコードはイケてないのでリベンジした