PDA

View Full Version : Подсчет количества строк в "логах". Как?


bulbator
03-03-2010, 08:29
Задача:

Ослеживать кол-во СПАМ-а на почтовом сервере.

В почтовый лог пишется результат анализа почты на СПАМ. В принципе можно эту информацию получить фильтруя лог по определенным последовательностям символов, но элемент данных log[файл<,regexp><,кодировка><,макс кол-во строк>,<режим>] выдает отфильтрованные по regexp строки. А как получить просто кол-во отфильтрованных строк (типа режим count)?

Напр. мне нужно сделать 3 счетчика:

spam=log[файл<,regexp1><,кодировка><,макс кол-во строк>,<режим>]
maybe_spam=log[файл<,regexp2><,кодировка><,макс кол-во строк>,<режим>]
not_spam=log[файл<,regexp3><,кодировка><,макс кол-во строк>,<режим>]

Можно конечно наколхозить скрипт внешней проверки, но как-то оно ИМХО не рационально, когда все, за исключением подсчета, умеет делать агент...

Или такую задачу можно реализовать как-то по другому? Как?

Заранее сенькс всем откликнувшимся!

dima_dm
03-03-2010, 13:38
Я решаю эту задачу через Zabbix Agent
В /etc/zabbix/zabbix_agentd.conf
UserParameter=antispam.stat,/etc/zabbix/antispam_stat.pl
UserParameter=receive_dnsbl,egrep "receive_dnsbl:" /tmp/sendmail_avp_spam.txt|awk '{print $2}'
UserParameter=receive_dsl_dialup,egrep "receive_dsl_dialup:" /tmp/sendmail_avp_spam.txt|awk '{print $2}'
UserParameter=receive_rate_connection,egrep "receive_rate_connection:" /tmp/sendmail_avp_spam.txt| awk '{print $2}'
UserParameter=receive_rate_limit,egrep "receive_rate_limit:" /tmp/sendmail_avp_spam.txt| awk '{print $2}'
И т.д.
Также можно писать более красивые выборки данных через параметры UserParameter=stat , пример http://www.zabbix.com/forum/showthread.php?t=15691

Скрипт /etc/zabbix/antispam_stat.pl пишет статистику в файл /tmp/sendmail_avp_spam.txt
Ключ: Значение

А дальше я получаю данные из файла /tmp/sendmail_avp_spam.txt вызовами receive_dnsbl и т.д.
Рекомендую делать именно так, а не использовать функции log, т.к. можно настроить более гибко обработку данных, и ресурсов системы тратится намного меньше, т.к. лог файл читается и обрабатывается только один раз и начиная с места, где закончилась предыдущая обработка (для этого достаточно просто запоминать точку последней обработки и писать её в файл, и читать c начала файла если точка последней обработки больше размера файла, т.е. лог файл отротейтился).

bulbator
03-03-2010, 14:54
Рекомендую делать именно так, а не использовать функции log, т.к. можно настроить более гибко обработку данных, и ресурсов системы тратится намного меньше, т.к. лог файл читается и обрабатывается только один раз и начиная с места, где закончилась предыдущая обработка (для этого достаточно просто запоминать точку последней обработки и писать её в файл, и читать c начала файла если точка последней обработки больше размера файла, т.е. лог файл отротейтился).
Дык....если раздробить задачу, получается:
1. Читать лог-файл
2. фильтровать строки
3. запоминать место остановки
4. считать строки

Пункты с 1 по 3 уже реализованы в агенте, зачем изобретать велосипед? Осталось только посчитать строки....Просто я думал что это реализовано, но хитро спрятано....

dima_dm
03-03-2010, 14:58
Да, только я считаю 25 и более переменных, а если это делать через функцию log, это 25 операций чтения и обработки логов. И сравните это с 1-й операцией чтения и обработки логов. А логов у меня по 500 Mb в сутки на каждой системе.

bulbator
03-03-2010, 15:06
в принципе логично.....нада мозгу поразминать... :)