Swatch — мониторинг логов

Swatch — мониторинг логов

Наверно, вы не раз сталкивались с тем, что утилита или скрипт не имеют возможности сигнализировать о ходе своей работы, кроме как записи в лог. Такие системы мониторинга, как, к примеру, ZABBIX, умеют мониторить логи и обрабатывать события, с ними связанные. Но лично мне не нравится, так как zabbix пишет в базу прямо кусок лога, чем сильно ее «подтормаживает». Поэтому для мониторинга сообщений в логах я использую swatch (не путать с часами =)).

Ставится он из репозитариев как на centos, так и на debian:

Debian:

sam@debian1:~:11/06/14-08:21$ sudo aptitude show swatch
Пакет: swatch
Новый: да
Состояние: установлен
Автоматически установлен: нет
Версия: 3.2.3-1
Приоритет: необязательный
Раздел: admin
Сопровождающий: Ryan Niebur <ryanryan52@gmail.com>
Архитектура: all
Размер в распакованном виде: 115 k
Зависимости: perl (>= 5.6.1), libtimedate-perl, libtime-hires-perl, libdate-calc-perl, libfile-tail-perl, libdate-manip-perl
Описание: Log file viewer with regexp matching, highlighting & hooks
 Swatch is designed to monitor system activity.  It reads a configuration file which contains pattern(s) to look for and action(s) to perform when each pattern is found.

 A typical action is echoing the matched line in a variety of colours and formats including reverse video, bold, underline, and normal, which swatch knows how to do internally.  Other
 actions include sending mail or executing an arbitrary program on the line.

 Swatch is written in Perl and uses Perl regular expressions for line matching.
Сайт: http://swatch.sourceforge.net/

sam@debian1:~:11/06/14-08:14$ sudo aptitude install swatch

CentOS:

sam@centos1:~:11/06/14-08:23$ sudo yum info swatch
Available Packages
Name        : swatch
Arch        : noarch
Version     : 3.2.3
Release     : 7.el6
Size        : 49 k
Repo        : epel
Summary     : Tool for actively monitoring log files
URL         : http://swatch.sourceforge.net/
License     : GPLv2+
Description : The Simple WATCHer is an automated monitoring tool that is capable
            : of alerting system administrators of anything that matches the
            : patterns described in the configuration file, whilst constantly
            : searching logfiles using perl.

sam@centos1:~:11/06/14-08:24$ sudo yum install swatch

По сути, это перловый скрипт, поэтому каких-либо «сверх» зависимостей он  не тянет за собой.

Что я хочу мониторить? Ошибки в логах php-fpm. Конкретно — «PHP Fatal error».  Swatch умеет работать как в интерактивном режиме, так и в режиме демона. Интерактивный можно использовать для диагностики. Так же swatch умеет выполнять действия при появлении нужной строки. Конечно, имеются критерии поиска. То есть swatch можно настроить так, чтобы действия срабатывали при определенном количестве (лимите) строк, при превышении  строк в секунду и так далее.

Приведу пример рабочего конфига:

[sam@centos1 ~]$ cat /etc/swatch/swatch.phpfpm-test.conf
watchfor /(PHP Fatal error:  )(?!.*test.*)/
        threshold type=both,count=10,seconds=60
        echo
        exec "echo "Tut slomalos""

Тут используется «трешхолд» both, который сработает при определенном количестве строк за определенное время (10 строк за 60 секунд).  Строка для поиска указывается после слова «watchfor» обычным регулярным выражением. Как здесь видно . я ищу совпадение в строке «PHP Fatal error: «, но кроме слова «test». Из действий выполним просто «echo», то есть вывод на экран найденной строки, и «exec» — для выполнения какой-нибудь команды, пусть будет сообщение:)

Для теста создам php-скрипт с несуществующим классом:

[sam@centos1 ~]$ cat check-error.php
<?php

new hgghgh();

?>

Теперь выполню его через веб и увижу такую ошибку:

php

Рис. 1. Ошибка в браузере при выполнии php скрипта

А в логах:

[sam@centos1 ~]$ sudo cat /var/log/php-fpm/error.log
[08-Jun-2014 03:30:01] NOTICE: error log file re-opened
[11-Jun-2014 06:34:43] WARNING: [pool www] child 18908 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"

Теперь запустим swatch в интерактивном режиме, для работы необходимо указать файл конфигурации и файл для мониторинга, и обновим страничку несколько раз:

[sam@centos1 ~]$ sudo swatch --config-file=/etc/swatch/swatch.phpfpm-test.conf --tail-file=/var/log/php-fpm/error.log

*** swatch version 3.2.3 (pid:3331) started at Wed Jun 11 07:04:49 MSK 2014

[11-Jun-2014 07:05:02] WARNING: [pool www] child 18814 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
Tut slomalos

Видим, что swatch честно обнаружил совпадение. Глянем лог:

[sam@centos1 ~]$ sudo cat /var/log/php-fpm/error.log
[08-Jun-2014 03:30:01] NOTICE: error log file re-opened
[11-Jun-2014 06:34:43] WARNING: [pool www] child 18908 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:01] WARNING: [pool www] child 18805 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18807 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18808 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18809 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18810 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18811 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18812 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18813 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18815 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18814 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18816 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18817 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18818 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18819 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18820 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18821 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18822 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18823 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18825 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18824 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"
[11-Jun-2014 07:05:02] WARNING: [pool www] child 18826 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Class 'hgghgh' not found in /var/www/check-error.php on line 3"

То есть все работает. Теперь можно запустить swath как демон, указав параметр

--daemon

Кроме выполнения команд и вывода найденной строки на экран, swatch умеет отправлять почту, вести свой лог (ну или просто запись в файл), использовать пайпы и еще много чего.

Трешходов всего три вида:

limit будет срабатывать до достижения лимита первых совпадений за определенный период. То есть  при задании count=10, seconds=60 действия будут выполняться 10 раз  в течении минуты только при первых 10 совпадениях ;

both сработает при определенном количестве строк в период времени. То есть  при задании count=10, seconds=60 действия выполнятся только один раз за минуту;

threshoild сработает на каждое совпадение до тех пор, пока не достигается определённое количество в период времени. То есть при задании count=10, seconds=60 действия выполнятся 10 раз в течении минуты. Если непонятно, то в отличие от limit, threshoild сработает на любые 10 совпадений, тогда как limit — только на первые 10.

В общем, ман вам в руки. Вещь очень полезная, даже без использования каких-либо дополнительных параметров.