Fluentd メール通知 フィルタリングする
SYSLOG(warn以上)を、NW機器からFluentdに収集してエラー検知に役立てようと
思っているが、全てメール通知したのではノイズが多く運用に耐えない。
条件は、環境によりまちまちだが特定の条件を除外(出来る限りノイズを減らしたいという思い)し、
メール通知する事は出来ないかと考え、Fluentdのプラグインを使い比較的簡単に出来たのでメモ。
収集の仕組みは、ここでは触れないがざっくり書くと
rsyslogで一度集めてセパレートして、/var/log/messageからwarn以上のログを別ファイルに保存
↓
その別ファイルをFluentdのin_tailで読込む
※インプットプラグインにsyslogがあるようなので、近いうちにそちらに乗り換えればシンプルになるはず。地味に複雑なのは、1年前くらいに作った時にsyslogインプットが有ることを知らなかったから。。
■やりたい事
・ログレベルinfo,notice,warningは緊急性はないと考え通知対象から除外
・通知不要なものは、message部の文字列マッチングで随時除外出来る構成にする
■使用するプラグイン
・fluent-plugin-rewrite ※タグつけと正規表現による文字列除外や変換
https://github.com/kentaro/fluent-plugin-rewrite
・fluent-plugin-mail ※マッチしたタグをメール送信する機能
https://github.com/u-ichi/fluent-plugin-mail
■設定
手元の環境で、fluent-plugin-mailはインストールしているが、fluent-plugin-rewriteはなかったのでインストールから。
①リライトプラグインのインストール
# /usr/lib64/fluent/ruby/bin/gem install fluent-plugin-rewrite
Fetching: fluent-plugin-rewrite-0.0.12.
gem (100%)
Fetching: cool.io-1.1.1.gem (100%)
Building native extensions. This could take a while...
Successfully installed fluent-plugin-rewrite-0.0.12
Successfully installed cool.io-1.1.1
2 gems installed
Installing ri documentation for fluent-plugin-rewrite-0.0.12...
Installing ri documentation for cool.io-1.1.1...
Installing RDoc documentation for fluent-plugin-rewrite-0.0.12...
Installing RDoc documentation for cool.io-1.1.1...
②アウトプットプラグインの設定
処理的には、in_tailでaaa.zタグが付けられたレコードに対して、
rewriteフィルタで除外条件をつける。
除外条件にマッチしないものは、mailというプレフィックスがつき、
次のマッチ条件でメール送信とファイル出力を行う。
<match aaa.z>
type rewrite
add_prefix mail #条件にマッチしたレコードにフィルタを追加
<rule> #message部の除外文字列指定
key message
#ここに除外文字列を記載
pattern ^.*(aaa).* #messageにaaaが含まれていたら除外
ignore true
</rule>
<rule> #ログレベルがwarn以下の場合は除外
key level
pattern (info|notice|warning|warn)
ignore true
</rule>
</match>
<match mail.aaa.z>
type copy
<store>
#mail送信部分
type mail
host #SMTPサーバIP
port #接続ポート
domain #送信元ドメイン
from #送信元アドレス
to #受信アドレス
subject #タイトル なんでもいい
message SYSLOG Alerts\n\n[Time]:%s\n\n[Host]:%s\n\n[Log_Level]:%s\n\n[Message]:%s\n \n\n #メッセージBODY
message_out_keys time,host,level,message #メッセージに使うキー
</store>
#動作確認で、ファイルでも見たいので。。
#運用にのったらいらなくなる。
<store>
type file
path #出力パス Fluentdの起動ユーザに書込み権限ないとパーミッションエラーでこけるので注意。
</store>
</match>
■簡単なテスト
お試しでログを吐いてみる
logger -s local0.err 'logtest'
logger -s local0.warn 'logtest'
実際のメールの本文
--------------------------------------
SYSLOG Alerts
[Time]:2014-01-29T19:41:06+09:
[Host]:ホスト名
[Log_Level]:err
[Message]:logtest
--------------------------------------
ちゃんとwarnのレコードは除外されメール来ず、errのものだけ来ました。
ひとまずやりたい処理は出来ました。