Простой мониторинг событий в логах

Для мониторинга определенного события в логах решил использовать 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.

comments powered by Disqus