としたにあんの左脳

備忘録です.

Flaskでltsv形式のログを出してみた.

前置き

最近,いろいろな問題に直面して,ログの重要性を実感しました.そのため,複数のサーバに分散したログを収集する試みを行っています.

その際使用しているのがfluentdです.

fluentdの説明は割愛しますが,以下の記事が参考になると思います.

Fluentdで始めるリアルタイムでのログ有効活用

実運用上では,アプリケーションからファイルへ出力されるログをfluentでtailして収集することが多いと思います.

その際,ログを正規表現でパースしてあげる必要があるのですが,組み込みのフォーマットであれば,正規表現を書く必要がありません.

この組み込みフォーマットには以下のものが有ります.(参考: fluentd/lib/fluent/parser.rb - Githubより

  • apache

  • apache2

  • syslog

  • json

  • tsv

  • ltsv

  • csv

  • nginx

この中でアプリケーションで利用することを考えると,json tsv ltsv csv に絞られます.

ltsv形式は,かなり新しい形式らしく,tsvにkeyをつけたものらしいです.

LTSV FAQ - LTSV って何? どういうところが良いの?を参考にするといいと思います.

fluentdはログをJSON形式で保持します.上記の4つの中で,key-value形式になっているものはjsonltsvです.

tsv csvはkeyを持たないため,fluentdの設定で,tailしてきた内容に対して,keyを割り当てなければなりません.

この際問題になるのが,ひとつのログファイルで一貫して同じ形式のログを出力しなければならないことです.ログの要素数を可変にしたい場合にはこれらは向きません.

残るは.jsonltsvです.これらは.ログの効果としては同じ能力を持っていると言えます.(多分)

この際の選択基準として.

  • 汎用性を選ぶなら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 の運用もしているので,時間があれば書きたいなぁ.

(追記)

このコードはイケてないのでリベンジした

http://toshitanian.hatenablog.com/entry/2013/12/10/130439