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のものだけ来ました。
ひとまずやりたい処理は出来ました。