bash скрипт для бесконечного парсинга лога

Автор zCirill, 08 ноября 2013, 21:11:22

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

zCirill

Добрый день.

Есть астериск на котором летит debug в лог. В день примерно 1.2-2.0 гига.
Надо отлавливать определенные события и делать с ними всякое.

Корректно ли сделать tail -f с проверкой if прилетающих строк на события?

типа tail -f | while read n; do
             if [ парсинг строки совпал с error ]; then blabla
             elseif [ парсинг строки совпал и тд

Или правильнее ротировать лог каждые пять минут, проверять получившийся кусок и проверять следующий?

Malaheenee

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

zCirill

Цитата: Malaheenee от 09 ноября 2013, 07:06:01Можно воспользоваться watch, если строки с определенными условиями необходимо накапливать.
не, мне нужно реагировать на события "отображенные" в логи.

увидел что регистрация отвалилась в таком то транке - делай то то. в другом транке - делай это, два телефона отвалилось - смс туда то.

Malaheenee

#3
Так логов за 10 секунд может накопиться больше чем на 10 строк. Лучше "покусочный" анализ.
Мы бы для такой задачи воспользовались perl - проще получится. Открытие каждые 5 минут, индекс текущей позиции в переменной, переход на нужную позицию, читаем строки в массив, парсим, выполняем условия, обновили переменную-индекс, закрыли...
Все мы где-то, когда-то и в чем-то были новичками.

smallNix

А не проще на С/С++ написать парсер и гонять его в режиме демона? Лог не пустой - парсим, ели нет данных спим секунду.  :-\
Кто-то же должен что-то делать...

zCirill

Цитата: smallNix от 11 ноября 2013, 00:06:53А не проще на С/С++ написать парсер и гонять его в режиме демона? Лог не пустой - парсим, ели нет данных спим секунду. 

возможно проще, если бы я умел писать на C/C++  :)

вообщем сделал "каркас", работает.

делаем пид для последующего убийства скрипта, функции делающие что то, и в цикле проверям строку на совпадения


echo $$ > /var/run/log.analyser.pid

SLC () {
logger 'CONNECTION'
}

SLD () {
logger 'DISCONNECTED'
}

tail -f /var/log/asterisk/full | while read n; do
if [[ $n =~ connection$ ]] ; then SLC && continue
elif [[ $n =~ disconnected$ ]] ; then SLD
fi;

done



работает на ура. периодически прилетает в лог прилетает 20к строк (последствия дебага перезагрузки приложения) переваривает за 5 секунд с загрузкой одного ядра corei5 3200 ghz, на 46 процентов
logrotate перед вращением /var/log/asterisk/full убивает скрипт по пиду, потом запускает скрипт снова.

ЗЫ
регулярки сила, сначала я сделал проверки через echo лала
   if [ "`echo $n | grep -o 'connection$'`" = "connection" ]; then SLC && continue
   elif [ "`echo $n | grep -o 'disconnected$'`" = "disconnected" ]; then SLD
и в таком варианте 20к строк лопатит за 50 секунд. что весьма огорчительно (учитывая, что в рабочем скрипте будет 7 проверок), но потом мне показали как сравнивать через встроенные средства bash - и хурра, шевелится )

rayanAyar


zCirill