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の環境構築から動作確認まで出来ます。
- mrubyをダウンロード・ビルド
- mrubyディレクトリにある
build_config.rb
を編集 - mrubyを
rake
コマンドでビルド - Fluentdを起動
- サンプルプログラムを実行
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からもFluentdを使いたい。そこで mruby-fluent-logger を試作しました。機能限定ですが動きます。現在mruby-msgpackがまだないため、mruby-jsonを利用しています。
https://t.co/JryNp7aHGO
#fluentd
— Y.Kentaro (@yoshi_ken) July 21, 2013
これで、色々なデバイスやC/C++アプリに組み込んだmrubyからfluentdにデータを送れる。 https://t.co/jGjFdWa5w6
— MATSUMOTO, Ryosuke (@matsumotory) July 21, 2013
あとがき
mrubyに関する記事や話題を最近耳にすることが増えてきました。
移植性の高さもそうですが、1つのバイナリにすべて組み込むため、アプリケーションの一部として内包する事も出来るそうです。という事はあんなことやこんなことも・・・!?と夢は膨らみ、記事を片っ端から読んでいくと、気づけばmrubyの虜です。
いいですね、mruby。
また何か作ったら発表したいと思います。
そして、GitHubページの右上にあるスターをイイネ!代わりに押して頂けると嬉しいです。