Простой мониторинг событий в логах
Для мониторинга определенного события в логах решил использовать swatch. Программа предоставляет легконастраиваемый мониторинг и так же легкорасширяемые действия в случае срабатывания триггера.
Программа написана на Perl, что, по крайней мере для меня, является огромным плюсом.
После установки пакета программы из репозиториев своего дисрибутива (модуль не загружен в CPAN) можно почитать man swatch
, но он менее информативен, чем perldoc swatch
и это удивительно.
Единственный минус программы - срабатывание только на одно событие. Добавить несколько событий для меня показалось невозможным.
Допустим на срабатывание события TIMEOUT
в случае общения с RADIUS-серевром конфиг будет выглядеть так:
watchfor /ETIMEOUT/
threshold track_by=/ETIMEOUT/,type=both,count=10,seconds=60
exec /usr/local/bin/jabber-send
Сохраняем его в /etc/swatch.conf
. Когда срабатывает 10 повторений в течении 60 секунд, то надо вызвать скрипт /usr/local/bin/jabber-send
(отправляет уведомление в jabber).
Создаем init скрипт следующего содержания:
#!/bin/bash
#
# /etc/init.d/swatch
CONFIG="/etc/swatch.conf"
PID="/var/run/swatch.pid"
PIDS="/tmp/pids.txt"
TAILF="/var/log/service/full.log"
RETVAL=0
swatch_start() {
if [ -f $PID ]
then
echo "Swatch is already running"
cat $PID
else
echo "Starting Swatch"
/usr/bin/swatch --config-file=$CONFIG --tail-file=$TAILF --pid-file=$PID > /dev/null 2>&1 &
RETVAL=$?
fi
}
swatch_stop() {
if [ -f $PID ]
then
echo "Stopping Swatch"
PARENT="$(< "$PID")"
INIT_PID=`ps -o ppid $PARENT |awk ' /[0-9]+/ { print $1 } '`
CPID1=`ps --ppid $PARENT |awk ' /[0-9]+/ { print $1 } '`
kill -9 $INIT_PID $PARENT $CPID1
rm -f $PID $PIDS
RETVAL=$?
else
echo "Swatch is not running!"
fi
}
swatch_status() {
if [ -f $PID ]
then
echo "Swatch is running"
PARENT="$(< "$PID")"
INIT_PID=`ps -o ppid $PARENT |awk ' /[0-9]+/ { print $1 } '`
ps -o pid -o command --pid $INIT_PID --pid $PARENT --ppid $PARENT
else
echo "Swatch is not running"
RETVAL=$?
fi
}
case "$1" in
start)
swatch_start
;;
stop)
swatch_stop
;;
restart)
swatch_stop
swatch_start
;;
status)
swatch_status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit $RETVAL
Особое внимание надо уделить переменной TAILF
, т.к. в ней прописывается лог-файл, за которым надо наблюдать. Если удалить эту опцию, то, по умолчанию, наблюдение ведется за /var/log/messages
.
После запускаем swatch
как обычный сервис и ждем, когда придет сообщение в jabber
.