きっかけ
- td-agent(fluentd) で独自にログを解析する正規表現を作らないといけない状況で手軽に正規表現を試行錯誤する方法が無いか探したらドンピシャな記事があったのでやってみた
- 従来は
td-agent.conf
を修正してリスタートを繰り返していた - 目からウロコだったので復習の意味を込めてメモ
- ちなみに自分は一般的な正規表現を理解するところが始めないといけないレベルです
参考
- Fluentdでparser用の正規表現を書く・試す
- [Ruby][Fluentd]in_tailの正規表現をテスト
- Fluentdのformat(正規表現)の作り方について試行錯誤中 #fluentd
- 正規表現
どんな風にやるのか
fluentd がどーやって正規表現を解析しているのか
こちらに書かれているように fluentd/parser.rb
の RegexpParser
で正規表現を解析しているらしい。何はともあれやってみることにした。
実際にやってみる
解析の対象となるログは以下のような 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
つづけて、日付と時間の部分を以下のように解析してみる。
ちなみに、実際は上記のように試行錯誤している。まったくもってマッチしない場合には warn
メッセージの代わりに NoMethodError: private method warn' called for nil:NilClass
という洗礼が待っている。
少しずつ解析の範囲を広げていく。
最終的に上記の 15 行目のように一行全てのログを解析出来た。まさに目からウロコ。
スクリプトで
こちらを参考にして下記のようなスクリプトを作った。必要に応じて log
や regexp
を書き換えながら試行錯誤していく。
上記を実行すると..
irb
で行った時のように解析される。まさに目からウロコ。注意点は他の ruby
環境が存在する場合 irb
の時と同様に fluentd(td-agent) 用の ruby
を利用しなければいけないこと(もしくは fluentd の組み込み parser を require する為にライブラリパスを通しておく必要がある)
ということで
- さくさく正規表現を駆使して format を書ける方がマジで羨ましい
irb
を使うことでfluentd
だけでなくruby
でスクリプトを作る際ののデバッグ術を知ったChef
でruby
を知ってfluentd
でruby
を勉強させて頂いてます- ありがとうございます