Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

mrubyからイベントログ収集ツールFluentdを扱う"mruby-fluent-logger"を公開しました

イベントログ収集ツールFluentdに、mrubyからも構造化ログデータを送りたい。
その情熱に勢いを任せて、"mruby-fluent-logger" を作りましたので公開します。
これを使えば、C/C++アプリに組み込んだmruby等からFluentdを容易に扱えますね。

そんな"mruby-fluent-logger"はこれらの用途に最適です。

  • アプリケーションログ・デバッグログを送る
  • 組み込み機器のセンサー情報などを送る

夢が広がりますね!

mruby-fluent-loggerとは

mrubyから呼び出せるロガークラスで、Fluentdへ構造化データを送れます。

GitHubリポジトリにてソースを公開しております。
https://github.com/y-ken/fluent-logger-mruby

mrubyからの呼び出し方法

アルファリリースとも言うべき段階のため、必要最低限の機能のみ実装しました。
以下サンプルコードではmyapp.access {"agent":"foo"}というログが記録されます。

log = Fluent::Logger.new('myapp', :host=>'127.0.0.1', :port=>8888)
log.post('access', {"agent"=>"foo"})

なお、クラス初期化時の引数はいずれも省略可能です。

mrubyへの組み込み方法

Unix/Linux/MacOSX環境を想定した手順を解説します。
この5ステップでmrubyの環境構築から動作確認まで出来ます。

  1. mrubyをダウンロード・ビルド
  2. mrubyディレクトリにあるbuild_config.rbを編集
  3. mrubyをrakeコマンドでビルド
  4. Fluentdを起動
  5. サンプルプログラムを実行

mrubyをダウンロード・ビルド

リポジトリをクローンし、rakeコマンドを実行します。
驚くかもしれませんが、これだけで手元にmruby環境を構築出来ます。

# 作業場所(仮にworkspaceとします)に移動
$ cd ~/workspace

# mrubyをダウンロード
$ git clone https://github.com/mruby/mruby.git

# 素の状態でビルド(コンパイル)
$ cd ~/workspace/mruby
$ rake

# mrubyの動作をワンライナーで確認
$ bin/mruby -e "puts Time.now"
Sun Jul 21 23:36:45 2013

mrubyディレクトリにあるbuild_config.rbを編集

build_config.rbを編集し、以下のようにconf.gemの行を追加してください。

$ cd ~/workspace/mruby
$ vi build_config.rb
MRuby::Build.new do |conf|
  ...snip...

  conf.gem :git => 'https://github.com/iij/mruby-io.git'
  conf.gem :git => 'https://github.com/iij/mruby-socket.git'
  conf.gem :git => 'https://github.com/iij/mruby-pack.git'
  conf.gem :git => 'https://github.com/mattn/mruby-json.git'
  conf.gem :git => 'https://github.com/mattn/mruby-http.git'
  conf.gem :git => 'https://github.com/y-ken/mruby-simplehttp-socket.git'
  conf.gem :git => 'https://github.com/matsumoto-r/mruby-httprequest.git'
  conf.gem :git => 'https://github.com/y-ken/fluent-logger-mruby.git'

  ...snip...
end

なお、mruby-fluent-loggerはmgem-listにも登録済みのため、mgemコマンドを利用してbuild_config.rbを生成することも出来ます。

mrubyをrakeコマンドでビルド

rakeないしmakeコマンドで、mruby, mrbc, mirbバイナリをビルドします。

$ cd ~/workspace/mruby
$ rake

Fluentdを起動

ログを受信出来るよう、Fluentdをローカル環境にてに起ち上げます。 今回は fluentd-skeltonという、Fluentd環境を簡単構築出来るものを使いますが、もし既にあれば省略して結構です。

# リポジトリをダウンロード
$ cd ~/workspace
$ git clone git@github.com:y-ken/fluentd-skelton.git

# 依存するgemをvendor/bundle以下に展開
$ cd ~/workspace/fluentd-skelton
$ bundle install --path vendor/bundle

# fluentdデーモンをバックグラウンド起動
$ bundle exec fluentd --config etc/fluent.conf --log fluent.log &

サンプルプログラムを実行

事前に以下のプログラムを用意します。

$ cd ~/workspace/mruby
$ vi post-fluentd.rb
log = Fluent::Logger.new('debug', :host=>'127.0.0.1')
log.post('myapp', {"message"=>"foo"})

用意が出来たら、実行してみましょう。

$ cd ~/workspace/mruby
$ bin/mruby post-fluentd.rb

fluent.logに、debug.myapp {"message":"foo"}といったログが出ていれば成功です。

$ cd ~/workspace/fluentd-skelton
$ tail -f fluent.log

以上にように、とても簡単にmrubyからログをFluentdに送れるようになりました。

謝辞

思いのほか多くの方々にツイートを取り上げて頂きました。
ありがとうございます!!

あとがき

mrubyに関する記事や話題を最近耳にすることが増えてきました。
移植性の高さもそうですが、1つのバイナリにすべて組み込むため、アプリケーションの一部として内包する事も出来るそうです。という事はあんなことやこんなことも・・・!?と夢は膨らみ、記事を片っ端から読んでいくと、気づけばmrubyの虜です。

いいですね、mruby。
また何か作ったら発表したいと思います。

そして、GitHubページの右上にあるスターをイイネ!代わりに押して頂けると嬉しいです。