fluentdのプラグインを書く練習をする為にsecureログをparseしてZabbixで値が取得できるようにしてみた(作成編)

January 20, 2013

https://github.com/kenjiskywalker/fluent-plugin-securelog-parser

   ,j;;;;;j,. ---一、 `   ―--‐、_ l;;;;;;  
  {;;;;;;ゝ T辷iフ i      f'辷jァ   !i;;;;;    全く触ったことがなくてもpluginを書いたらfluentdがわかる  
   ヾ;;;ハ        ノ              .::!lリ;;r゙  
     `Z;i      〈.,_..,.            ノ;;;;;;;;>    そんなふうに考えていた時期が  
     ,;ぇハ、  、_,.ー-、_',.      ,f゙: Y;;f.      俺にもありました  
     ~''戈ヽ    `二´      r'´:::.  `!  

最初Postfixのmaillogつくってやろうかなんて
思っていたりした時期もオレにはありました。

しかしログが多様すぎるので、ちょっとこれ最初にやるには敷居高いなー
と思い、だからってあんまり理にかなわないことをしても意味ないな
ということで、/var/log/secureのログを指定した文字列の出現具合を
Zabbixで取得したら面白いかなというアイデアが思いついたので
取り敢えずコードは汚いにしろ、動くまで書いてみたメモです。

設定編はこちら

作成編

事前にtestが通るまでのものは
超初級!Fluentdのプラグインを書きたくなった時の下地づくりにて作成しています。

本来はもっとスマートな作り方があるのでしょうが、
私は基本的にこの流れで行いました。

  • 内容を更新する度にrake testでtestが通ることを確認する
  • 変数の状況をp hogeで毎回確認する

この2つの繰り返しでした。

参考

基本はりぴーさんの記事を参考に、取り敢えず片っ端からpluginのソースを読んでいけば
センスの良い人ならその場で書けそうなものですが、いかんせん素人なので
試行錯誤しながら書いて行きました。

取り敢えず動いたレベルですが、何かの参考になればと思います。

https://github.com/kenjiskywalker/fluent-plugin-securelog-parser

また、ソースを見て頂く通り、何かのログのパーサを書こうと思えば
*regexp*と*time_format*さえどうにかなれば、
プラグインの種類にもよりますが、いくらでも加工することが可能です。
fluentd、素晴らしいですね。

*tag*、*es*、*chainの中身などを.each*などで分解していき
testを実行した際に(test_emit)で
プラグイン内部の確認したい変数の中身をp hogeする。

この繰り返していってという感じです。
ソースファイルのコメントアウト部は
コードを記述していた際には常に表示させていたものです。

サーバ上での動作のテストは
out_securelog_parser.rbファイルを/etc/td-agent/plugin/へ配置することで
プラグインとして認識してくれます。素晴らしいですね。

ログが出るのを待つのは大変なので

echo '{"message":"Jan 17 02:47:59 hostname sshd[10654]: test"}' | /usr/lib64/fluent/ruby/bin/fluent-cat secure

と、fluent-catコマンドを実行して、確認したい*tag*を指定することで
プラグインの確認を行うことが可能です。

ちゃんとテストを書いていないあw、中身はまだまだ改善の余地があるわでアレですが
Rubyもよくに書けず、fluentdを運用した経験もあまりない人間が
稚拙ではありますが、最低限動作するところまでは書くことができました。

ハイユーザーから、エントリーユーザまで利用でき、
かつ、簡単なログパーサから、各種メトリクス生成などのプラグインが
容易に作成することができるfluentdは、やはりこれからのオペレーションの
情報取得ツールとして、無くてはならないものになっていくんだろうな。
という印象を受けました。

awesome fluentd!

続きは設定編