Анализ файлов журнала в BASH для поиска записей «ОШИБКА» между определенными отметками времени - PullRequest
0 голосов
/ 15 августа 2011

Я пишу скрипт на BASH, который должен проверять файлы журналов на наличие ошибок.Я планирую запускать это как cron каждый час, поэтому я хочу, чтобы он только возвращал записи типа ERROR, которые произошли в течение последнего часа (все время сервера по Гринвичу).Я устанавливаю следующие переменные

# Log file directory
LOGPATH="/path/to/logs/"
# Current date and time
CURDATE=`date +%Y-%m-%d`
CURTIME=`date +%H:%M:%S`
# Old date and time
OLDDATE=`date +%Y-%m-%d -d "1 hour ago"`
OLDTIME=`date +%H:%M:%S -d "1 hour ago"`

Все файлы журнала соответствуют формату имени файла ktYEAR-MONTH-DAY.root.log.txt, где YEAR / MONTH / DAY заменяются датой записи записейв. Так, например, сегодняшний файл журнала будет kt2011-08-15.root.log.txt.Пример записи содержимого:

2011-08-15 | 19:30:02 | ERROR | 18333 | 337 | n/a | dms | default | error | XMLRPC Lucene - addDocument - Reason: Failed to parse XML-RPC request: An invalid XML character (Unicode: 0xb) was found in the element content of the document.

Интересующие столбцы: 1-й, 2-й, 3-й (значение может быть «INFO», «DEBUG» и т. Д., Но меня интересует только когда «ERROR»значение) и последний столбец, являющийся телом сообщения журнала.

Я пытаюсь выполнить этот скрипт BASH для анализа файлов, в которых есть записи, охватывающие последний час активности (как определено в 1-м и 2-м столбце), и если 4-й столбец содержит строку «ОШИБКА», то отобразите содержимое самого правого столбца.Моя путаница возникает, когда я пытаюсь определить, как анализировать файлы журналов на основе $CURTIME и $OLDTIME, что еще хуже, когда наступает полночь, и мне приходится искать в файле журнала предыдущего дня.Я бы предпочел не выполнять общий поиск в стиле grep по всем файлам журналов, так как количество и размер могут быть чрезмерными, но если это так, то так и будет.

Ответы [ 2 ]

2 голосов
/ 16 августа 2011
 awk -F ' \\| ' -v "d=$(date -d "1 hour ago" -u +%Y-%m-%d@%H:%M:%S)" '$3 == "ERROR" && $1"@"$2 > d'
1 голос
/ 16 августа 2011

Это так же просто, как сравнение строк в awk. Когда вы проходите полночь, просто добавьте файл $OLDDATE к поиску:

if [ "$CURDATE" != "$OLDDATE" ]; then
   cat "kt$OLDDATE.root.log.txt" "kt$CURDATE.root.log.txt"
else
   cat "kt$CURDATE.root.log.txt"
fi | awk -F "|" -v olddate=$OLDDATE -v oldtime=$OLDTIME -v curdate=$CURDATE 'BEGIN{olddate=olddate " "; curdate = curdate " "; oldtime = " " oldtime " "}
$1 == olddate && $2 >= oldtime && $3 == " ERROR "{print $0}
$1 > olddate && $3 == " ERROR "{print $0}'

Можно комбинировать с раствором Гленна, чтобы он был намного короче.

...