読者です 読者をやめる 読者になる 読者になる

Nagiosとrsyslog-pgsql を連携してみた

PostgreSQLの使い方を一通り覚えて、ようやく当初の目的である、Nagiosとの連携を試すことが出来た。
基本的には、PostgreSQLに貯めたsyslogから、該当時刻(ここでは15分ごととした) のログを取り出し、その中に正規表現で表現されるログがあるかどうかを探すスクリプトになる。

スクリプトPython で作成してみた。

#!/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

で実行する。