shnagaiの日記

主にエンジニアリング関連のトピックについて雑多に書いています

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:00

[Host]:ホスト名

[Log_Level]:err

[Message]:logtest

--------------------------------------


ちゃんとwarnのレコードは除外されメール来ず、errのものだけ来ました。
ひとまずやりたい処理は出来ました。