ようへいの日々精進XP

よかろうもん

in_tail の正規表現を試行錯誤する方法をやってみた

きっかけ

  • td-agent(fluentd) で独自にログを解析する正規表現を作らないといけない状況で手軽に正規表現を試行錯誤する方法が無いか探したらドンピシャな記事があったのでやってみた
  • 従来は td-agent.conf を修正してリスタートを繰り返していた
  • 目からウロコだったので復習の意味を込めてメモ
  • ちなみに自分は一般的な正規表現を理解するところが始めないといけないレベルです

参考


どんな風にやるのか

fluentd がどーやって正規表現を解析しているのか

こちらに書かれているように fluentd/parser.rbRegexpParser正規表現を解析しているらしい。何はともあれやってみることにした。


実際にやってみる

解析の対象となるログは以下のような Apache の error.log を解析してみることにする。

[Sat Aug 24 22:49:05 2013] [error] [client 10.0.3.1] File does not exist: /var/www/favicon.ico

irb で

こちらに書かれているように irb を使って正規表現の解析を試行錯誤してみる。

irb を起動する。

/usr/lib/fluent/ruby/bin/irb

つづけて、日付と時間の部分を以下のように解析してみる。

f:id:inokara:20130827225817p:plain

ちなみに、実際は上記のように試行錯誤している。まったくもってマッチしない場合には warn メッセージの代わりに NoMethodError: private method warn' called for nil:NilClass という洗礼が待っている。

少しずつ解析の範囲を広げていく。

最終的に上記の 15 行目のように一行全てのログを解析出来た。まさに目からウロコ。

スクリプトで

こちらを参考にして下記のようなスクリプトを作った。必要に応じて logregexp を書き換えながら試行錯誤していく。

上記を実行すると..

irb で行った時のように解析される。まさに目からウロコ。注意点は他の ruby 環境が存在する場合 irb の時と同様に fluentd(td-agent) 用の ruby を利用しなければいけないこと(もしくは fluentd の組み込み parser を require する為にライブラリパスを通しておく必要がある)


ということで

  • さくさく正規表現を駆使して format を書ける方がマジで羨ましい
  • irb を使うことで fluentd だけでなく ruby でスクリプトを作る際ののデバッグ術を知った
  • Chefruby を知って fluentdruby を勉強させて頂いてます
  • ありがとうございます