2015年3月12日木曜日

ログに特定の文字列が出力されたらメールで通知するには(rsyslog編)

今回は、rsyslogをswatchのように使ってみようという内容です。
※評価は、CentOS6.6(x86_64) + rsyslog-8.8.0で行っています


以下に、rsyslogの比較的新しいフォーマットでの記述方法と昔ながらの記述方法の2種類を記載します。
⇒ログに'network connection error' あるいは'authentication failures'の文字列が出力されたら、メールでの通知を想定した例です



RainerScript styleフォーマットでの記述例


module(load="ommail")
template(name="mailSubject"
         type="string"
         string="Error on %hostname%"
)
template(name="mailBody"
         type="string"
         string="RSYSLOG Alert\r\nmsg='%msg%'"
)

if \
        ( $msg contains 'network connection error' ) or \
        ( $msg contains 'authentication failures' ) \
then {
        action(
          type="ommail"
          server="localhost"
          port="25"
          mailfrom="alert@rsyslog.example.com"
          mailto="user01@rsyslog.example.com"
          subject.template="mailSubject"
          template="mailBody"
          body.enable="on"
          #action.execonlyonceeveryinterval="3600"
        )
}
※コメントアウトしているaction.execonlyonceeveryintervalパラメータは、メールの通知間隔を調整するのに使います。監視している文字列がログに大量に出力された時に、メールがバーストするのを防ぐ為に利用します。
⇒上記の記述をそのまま有効にした場合、1度メールを送信したら同じメールを送信できるのは1時間(3600秒)後になります



Legacyフォーマットでの記述例


$ModLoad ommail
$template mailSubject,"Error on %hostname%"
$template mailBody,"RSYSLOG Alert\r\nmsg='%msg%'"
$ActionMailSMTPServer localhost
$ActionMailFrom alert@rsyslog.example.com
$ActionMailTo user01@rsyslog.example.com
$ActionMailSubject mailSubject
#$ActionExecOnlyOnceEveryInterval 3600
if \
        ( $msg contains 'network connection error' ) or \
        ( $msg contains 'authentication failures' ) \
then :ommail:;mailBody
※コメントアウトしている部分は、先のaction.execonlyonceeveryintervalパラメータと同じ目的で利用します。



動作検証

Puttyなどの端末を2つ立ち上げておき、

  • 1つはメールログをtail、
  • もう一つで以下のようにloggerコマンドを実行 (⇒私の環境では/var/log/messagesに出力されました)

する事で動作を確認する事ができます。

# logger network connection error


実際に届いたメールはこんな感じになります。




0 件のコメント:

コメントを投稿