Nagiosとrsyslog-pgsql を連携してみた
PostgreSQLの使い方を一通り覚えて、ようやく当初の目的である、Nagiosとの連携を試すことが出来た。
基本的には、PostgreSQLに貯めたsyslogから、該当時刻(ここでは15分ごととした) のログを取り出し、その中に正規表現で表現されるログがあるかどうかを探すスクリプトになる。
#!/usr/bin/env python from pgsql import * import sys, time, re user='rsyslogusr1' passwd='aaa' if len(sys.argv) != 4: print "Usage: ./check_logs_pgsql.py" sys.exit(5) # get simple hostname rather than FQDN fromhost=(sys.argv[1]).split('.')[0] string_checked_warn=sys.argv[2] string_checked_crit=sys.argv[3] string_checked_warn_re=re.compile(string_checked_warn) string_checked_crit_re=re.compile(string_checked_crit) #string_checked_warn="WARN" #string_checked_crit="ERR" # calculate current time now=time.time() a_bit_before=now-900 def add_zero_if_small (str_num): if (-1 < int(str_num) < 10): return '0%s' % str_num else: return '%s' % str_num def give_time_string(time_from_epoch): (tm_year,tm_mon,tm_mday,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst) = map (add_zero_if_small, time.localtime(time_from_epoch)) return '%s-%s-%s %s:%s:%s' %(tm_year,tm_mon,tm_mday,tm_hour,tm_min,tm_sec) # perform db connection db=connect(database='Syslog', user=user, password=passwd, host='localhost', port=5432) cursor=db.cursor() cursor.execute("select receivedat, message, fromhost, priority from systemevents where receivedat between '%s' and '%s' and fromhost='%s'; " % ( give_time_string(a_bit_before) , give_time_string(now), fromhost ) ) logs=cursor.fetchall_dict() cursor.close() db.close() # perform log check for l in logs: mess = l['message'] if ( string_checked_crit_re.search(mess) != None ): print "CRITICAL:", l['priority'], str(l['receivedat']),l['message'],l['fromhost'] sys.exit(2) if ( string_checked_warn_re.search(mess) != None ): print "WARN:", l['priority'], str(l['receivedat']),l['message'],l['fromhost'] sys.exit(1) # no critical or warning logs found print "no [WARN: '%s'] and [CRIT: '%s']" % (string_checked_warn, string_checked_crit) sys.exit(0)
WARNのログと、CRITのログを同時に指定できるが、実際には片方のログしか使えない仕様 orz
Nagios と組み合わせた段階で、少し詰まったのだが、rsyslog は、同一のドメインに属するホストについては、fromhostとして、FQDNではなく、ホスト名を与える。 Nagios のホスト名にはFQDNを使っていたので、何故かWARNログがひっかかってくれず苦労した。 orz
正規表現の他に、rsyslog-pgsql は、priority も記録してくれるので、critial, emergency など優先度が高いログが出た際に、無条件で拾うようなスクリプトも作っておきたい。 ( # perform log check 以下を変更 )
作成の途中で git を使ってみたのだが、作成中のディレクトリで
$ git init $ git add .
を打つだけで使えるようになるので、中々使いやすい。
commitの時には、
$ git commit -a
で実行する。