macでfluentd のインストール 〜 out_exec_filterのrubyを試した #fluentd

@studio3104さんのエントリーを読んでて、↓は確かにできると便利そうだな〜と思ったものの、如何せんperlは使ったことがないのと、丁度Ruby修行中の身なので挑戦してみた。

webのアクセスログを解析する場合は、クエリストリングをパースしてゴニョゴニョしますよね。
解析のたびにパースするんだし、どーせなら全部fluentdにやってもらいたいところですよね。

とりあえずローカルだけでやってみた所、意外とローカルに全部盛りでやってる説明ってあんまり無かったのでまとめてみました。(最近だと皆td-agent使うでしょうしね。)
RVMやbrew等は入っている前提です。(丁度先日のエントリーでまとめてた。)


  • Fluentdのインストール
    • Installing Fluentd Using Ruby Gem | Fluentd
    • mac用のtd-agentってのは無さそうだったので素のFluentd。
    • すげー当たり前の話かもしれませんが、最後に"&" をつけてfluentdを起動した後は、jobs -l で該当のプロセスを確認して、killしてください。
      • mac端末でjobsってコマンドを入れるのはちょっとドキドキしますw


$ brew install mongodb
$ fluent-gem install fluent-plugin-mongo
$ gem install bson_ext -v=mongo_gemと同じバージョン


  • out_exec_filterで実行するRuby
    • スタジオさんのと違って、各パラメータを1フィールドにしています。
      • いつかTreasure Dataに上げる時にこっちのほうがHiveクエリ書き易そうな気がしたので。
    • 確実にもっと綺麗に短く書ける。。
    • printの代わりにputsって書いてて、エラーが出て一部欠落するという現象に結構苦しみました。。


  • 設定ファイル(ローカルの1プロセスで全部やってます。)
    • スタジオさんのblogを参考にout_formatはmsgpackにしています。
    • 今は公式ドキュメントにも書いてありました。

  • ローカルのindex.htmlにランダムなcategoryパラメータをつけて適当にアクセス
  • こんな感じで結果がとれる。
    • Mongoのクエリを駆使することで色々できそう。
    • parseの所で適当に間引いたり、何か目印となるフィールドを入れることもできるはず。
$ mongo
$ use fluent

-- category="01"のアクセス数
db.test.find({path: "/index.html", category: "01"}).count()

-- cateogry単位のアクセス数一覧
db.test.group({key:{category:true}, cond:{path:"/index.html"}, reduce:function(obj,prev) {prev.csum += 1;}, initial:{csum:0 } });


この形式であればTreasure Dataにそのままアップしてごにょごにょできそうなので、後日試してみる。とりあえず、アカウントは作った!


Software Design (ソフトウェア デザイン) 2012年 06月号 [雑誌]

Software Design (ソフトウェア デザイン) 2012年 06月号 [雑誌]