[Bash]Анализатор лог файлов (Скрипт для анализа логов и сортировки только самой нужной информации.)
Модератор: Модераторы разделов
-
rydj
- Сообщения: 27
[Bash]Анализатор лог файлов
Доброго времени суток. Есть программа которая после отработки записывает кучу лог файлов в них содержится такая информация:
****Step = red2
<много много строк инфы>
ERROR:
<много строк инфы>
****Step = white6
<много много строк инфы>
****Step = Xen
<много строк инфы>
ERROR:
Задача вот в чем если на шаге есть ошибки то в логе после шага будет строка начинающая с ERROR: для удобства диагностики самое важное это строчка с названием шага и строчка с ошибкой которая случилась в нем. В идеале если будут на выходе только те шаги где есть ошибки, но это по мере допиливания. Есть проекты и по каждому записывается лог файл. Для начала я решил на выход получать нужные мне строчки когда сделал это так:
find /home/user/log/* -type f -name '*.log' -print0 | xargs -0 awk '{if ($1 ~ /ERROR/) {print; print $0} else if ($3 ~ /Step:/) {print}}'
Но как мне получать имя файла лога в котором нашлись данные строки?
****Step = red2
<много много строк инфы>
ERROR:
<много строк инфы>
****Step = white6
<много много строк инфы>
****Step = Xen
<много строк инфы>
ERROR:
Задача вот в чем если на шаге есть ошибки то в логе после шага будет строка начинающая с ERROR: для удобства диагностики самое важное это строчка с названием шага и строчка с ошибкой которая случилась в нем. В идеале если будут на выходе только те шаги где есть ошибки, но это по мере допиливания. Есть проекты и по каждому записывается лог файл. Для начала я решил на выход получать нужные мне строчки когда сделал это так:
find /home/user/log/* -type f -name '*.log' -print0 | xargs -0 awk '{if ($1 ~ /ERROR/) {print; print $0} else if ($3 ~ /Step:/) {print}}'
Но как мне получать имя файла лога в котором нашлись данные строки?
-
Bizdelnick
- Модератор
- Сообщения: 21471
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: [Bash]Анализатор лог файлов
man awk
Код: Выделить всё
Built-in Variables Gawk's built-in variables are: ARGC The number of command line arguments (does not include options to gawk, or the program source). ARGIND The index in ARGV of the current file being processed. ARGV Array of command line arguments. The array is indexed from 0 to ARGC - 1. Dynamically changing the contents of ARGV can control the files used for data.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
rydj
- Сообщения: 27
Re: [Bash]Анализатор лог файлов
Код: Выделить всё
#!/bin/bash
DATE_NAMEDIR=`date +%Y-%m-%d`
reportfile=/home/sasinst/dovchinnikov/scripts/scan_report
find /home/sasinst/dovchinnikov/scripts/dev/* -type f -name '*.log' -print | while read dir
do
echo "-------------------------------------------------------------------------------"
echo "Job: $dir" >>/home/sasinst/dovchinnikov/scripts/scan_report
cat *$dir* |awk '{if ($1 ~ /ERROR/) {print; print $0} else if ($3 ~ /Step:/) {print}}'
doneИмена логов содержат пробелы, кат не читает(((. Есть заклинания для поправления проблемы желательно с сохранением while
-
rydj
- Сообщения: 27
Re: [Bash]Анализатор лог файлов
А всё, двойные кавычки спасли, спасибо.
-
rydj
- Сообщения: 27
Re: [Bash]Анализатор лог файлов
Написал скрипт:
У меня тут есть две серьезные проблемы.
1. папки с пробелами. Беда в том что после отработки появляется папка например:
/project/jobs/2013-10-18 00-15-11/
Если всё работает правильно то формируется директория: "г-м-д 00-1*" . Скпипт ругается что папки нет, проблема там в пробелах((
2. В идеале нужна сортировка еще по Step (шаг), мне нужны только шаги в которых есть ошибки если в логе есть строчка step и ниже до след строчки step не будет ошибок то выводить в отчет эту строчку мне не нужно.
т.е. в каждом логе записывается информация по отработанным шагам, у каждого шага есть имя. Если есть ошибка т.е. строчка "ERROR: инфа>" то нужно знать имя шага чтобы знать где искать проблему. Соответственно если ошибок нет то этот шаг не интересует.
Причем нужно иметь ввиду что строчка ERROR может возникнуть и до самого первого шага, ошибки нужно выводить все а не только те которые в шагах.
Код: Выделить всё
#!/bin/bash
#
# ->->->->->->->-> LOGSCAN VERSION 1.0 <-<-<-<-<-<-<-<-
#Скрипт анализирующий лог-файлы по отработанным джобам
#
#
DATE_NAMEDIR="`date +%Y-%m-%d` 00-1*"
reportfile=/var/tmp/scan_report.html #Файл отчета
P1=$1
function printUsage() {
cat <<EOF
SASLOGSCAN
$scriptName [dir] [-h]
Скрипт ищет лог-файлы анализирует их на ошибки и отправляет отчет в виде html странички на почту.
При запуске без параметров производится анализ директории заданной по умолчанию: /projects/jobs/
Для удобства использования пользователь имеет возможность задать параметры работы
[dir]
Директроия для анализа.
-h
Подсказка
EOF
}
if [ -z "$P1"]; then
LOGDIR=projects/jobs/$DATE_NAMEDIR*
else
if [ "$P1" = "-h" ]; then
printUsage;
exit
else
LOGDIR=$P1
fi
fi
if ! [ -d $LOGDIR ]; then
echo "Анализатор логов не отработал, не найдена директория: $LOGDIR" |mailx -s "ScanReport: error dir" test@post
exit 1
fi
#Формируем html страничку
echo "<HTML>" >$reportfile #Затираем старый файл отчета
echo "<HEAD>" >>$reportfile
echo "<TITLE>Отчет $DATE_NAMEDIR</TITLE>" >>$reportfile
echo "<META HTTP-EQUIV="Content-Type" CONTENT="text/html\; charset=UTF-8">" >>$reportfile
echo "<META NAME="Keywords" LANG=ru CONTENT="Отчет сканера">" >>$reportfile
echo "<META NAME="Description" CONTENT="Отчет сканера">" >>$reportfile
echo "<LINK REL="author" HREF="mailto:test@post">" >>$reportfile
echo "</HEAD>" >>$reportfile
echo "<BODY>" >>$reportfile
#Начинаем поиск log-файлов
find $LOGDIR -type f -name '*.log' -print | while read dir #цикл обрабодки каждого найденого файла
do
echo "<br>-------------------------------------------------------------------------------<br>">>$reportfile
echo "<b>Job: $dir </b><br>" >>$reportfile #Выводим имя джоба
cat "$dir" |awk '{if ($1 ~ /ERROR/) {print("<br><span style=\"color:#ff0000\">"); print $0;print("</span>")} else if ($3 ~ /Step:/) {print("<br>"); print}}' >>$reportfile #Сортируем поля по ERROR и Step
done
# Окончание html страницы
echo "</BODY>" >>$reportfile
echo "</HTML>" >>$reportfile
echo "Report OK" |mail -a $reportfile -s "ScanReport `date +%Y-%m-%d`" test@post #Отправка результатов на почту.У меня тут есть две серьезные проблемы.
1. папки с пробелами. Беда в том что после отработки появляется папка например:
/project/jobs/2013-10-18 00-15-11/
Если всё работает правильно то формируется директория: "г-м-д 00-1*" . Скпипт ругается что папки нет, проблема там в пробелах((
2. В идеале нужна сортировка еще по Step (шаг), мне нужны только шаги в которых есть ошибки если в логе есть строчка step и ниже до след строчки step не будет ошибок то выводить в отчет эту строчку мне не нужно.
т.е. в каждом логе записывается информация по отработанным шагам, у каждого шага есть имя. Если есть ошибка т.е. строчка "ERROR: инфа>" то нужно знать имя шага чтобы знать где искать проблему. Соответственно если ошибок нет то этот шаг не интересует.
Причем нужно иметь ввиду что строчка ERROR может возникнуть и до самого первого шага, ошибки нужно выводить все а не только те которые в шагах.
-
Bizdelnick
- Модератор
- Сообщения: 21471
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: [Bash]Анализатор лог файлов
Ну так ведь
Если не совсем спасли, значит, не везде их поставили, где надо.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
rydj
- Сообщения: 27
Re: [Bash]Анализатор лог файлов
Пробовал и так и сяк, если после даты ставить * то срабатывает а если "/projects/jobs/DATE_NAMEDIR 00-1*" то не катит причем пробовал ставить обратный слеш:
"/projects/jobs/DATE_NAMEDIR\ 00-1*" тоже ничего не дало(((
-
Bizdelnick
- Модератор
- Сообщения: 21471
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: [Bash]Анализатор лог файлов
В таком варианте, но без кавычек, должно работать. Но лучше так: "/projects/jobs/$DATE_NAMEDIR 00-1"*
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
rydj
- Сообщения: 27
Re: [Bash]Анализатор лог файлов
Bizdelnick писал(а): ↑18.10.2013 12:50
В таком варианте, но без кавычек, должно работать. Но лучше так: "/projects/jobs/$DATE_NAMEDIR 00-1"*
find: `/projects/jobs/2013-10-18 00-1*': No such file or directory
[test@01 2013-10-18 00-15-11]$ pwd
/projects/jobs/2013-10-18 00-15-11
-
Bizdelnick
- Модератор
- Сообщения: 21471
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: [Bash]Анализатор лог файлов
Вы лишних * напихали. Уберите отсюда:
А здесь добавите кавычки, как я писал:
А здесь добавите кавычки, как я писал:
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
-
rydj
- Сообщения: 27
Re: [Bash]Анализатор лог файлов
Код: Выделить всё
DATE_NAMEDIR="`date +%Y-%m-%d`"
LOGDIR="/projects/jobs/$DATE_NAMEDIR 00-1"*
find $LOGDIR -type f -name '*.log' -printИтог:
find: `00-1*': No such file or directory
Код: Выделить всё
DATE_NAMEDIR="`date +%Y-%m-%d`"
LOGDIR="/projects/jobs/$DATE_NAMEDIR 00-1"*
find "$LOGDIR" -type f -name '*.log' -printдобавил кавычки на find
итог:
/projects/jobs/2013-10-18 00-1*': No such file or directory
АГА =)
Пока экспериментировал нашлась формула успеха
Код: Выделить всё
DATE_NAMEDIR="`date +%Y-%m-%d`"
LOGDIR="/projects/jobs/$DATE_NAMEDIR 00-1"
find "$LOGDIR"* -type f -name '*.log' -printСпасибо за помощь минус одна проблема. А сможете помочь придумать как 2-ую решить это судя по всему awk может сделать, я пока экспериментирую, но не выходит.
-
rydj
- Сообщения: 27
Re: [Bash]Анализатор лог файлов
Всё разобрался. вот:
cat Testing_dir/2013-10-15\ 00-15-12/* |awk '{if ($3 ~ /Step:/) {a=$0; b=1}; if ($1 ~ /^ERROR:/){if (b==1 ){b=0; print a; print $0} else { print $0}}}'
cat Testing_dir/2013-10-15\ 00-15-12/* |awk '{if ($3 ~ /Step:/) {a=$0; b=1}; if ($1 ~ /^ERROR:/){if (b==1 ){b=0; print a; print $0} else { print $0}}}'
-
rydj
- Сообщения: 27
Re: [Bash]Анализатор лог файлов
Появился еще вопрос по скрипту.
Сейчас этот участок при начале обработки нового файла выводит его имя, а потом начинает обработку ошибок. А как можно сделать чтобы имя выводилось только тогда когда в нем найдена ошибка, но не при каждой ошибке а только 1 раз.
Например
ИМЯ файла
step: red
ERROR: critical
step: kk
ERROR:
ИМЯ файла
step: u77
ERROR:
Код: Выделить всё
find "$LOGDIR"* -type f -name '*.log' -print | while read dir #цикл обрабодки каждого найденого файла
do
echo "<br>-------------------------------------------------------------------------------<br>">>$reportfile
echo "<b>Job: $dir </b><br>" >>$reportfile #Выводим имя джоба
cat "$dir" |awk '{k=0;if ($3 ~ /Step:/) {a=$0; b=1}; if ($1 ~ /^ERROR:/){if (b==1 ){b=0; print a;print("<br>"); print $0; print("<br>")} else { print $0; print ("<br>")}}}' >>$reportfile #Сортируем поля по ERROR и Step
done
# Окончание html страницыСейчас этот участок при начале обработки нового файла выводит его имя, а потом начинает обработку ошибок. А как можно сделать чтобы имя выводилось только тогда когда в нем найдена ошибка, но не при каждой ошибке а только 1 раз.
Например
ИМЯ файла
step: red
ERROR: critical
step: kk
ERROR:
ИМЯ файла
step: u77
ERROR:
-
rydj
- Сообщения: 27
Re: [Bash]Анализатор лог файлов
Идея у меня кажется появилась, только реализация не выходит, может предварительно искать в файле ошибки грепом, если греп нашел строчки то &?=1 если не нашел то 0. Значит если есть ошибка в логе то пишем имя и начинаем обработку awk если нет переходим к след файлу. Как только реализовать?
-
rydj
- Сообщения: 27
Re: [Bash]Анализатор лог файлов
Мастера unix можете поделится мудростью.
Мне нужно чтобы find искал в директории все логи созданные или измененные за последние 24часа.
Команда правильная?
find "$LOGDIR"* -mtime 0 -type f -name '*.log' -print
Мне нужно чтобы find искал в директории все логи созданные или измененные за последние 24часа.
Команда правильная?
find "$LOGDIR"* -mtime 0 -type f -name '*.log' -print
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: [Bash]Анализатор лог файлов
1. путь без всяких звёздочек. просто "$LOGDIR" (можно без кавычек, может вам надо именно это)
2. mtime -1 это за сутки.
3. -name должно быть сначала (это не принципиально, просто быстрее проверять только логи, а не всё, и потом убирать всё кроме логов, как вы делаете). Касается и type -f.
4. print не нужно. Оно дефолт.
Спасибо сказали:
-
rydj
- Сообщения: 27
Re: [Bash]Анализатор лог файлов
В продолжение темы, про анализатор логов. Он у меня работает и процветает благодаря вам спасибо =)
Сейчас его потихоньку допиливаю, но вот столкнулся с проблемой: в лог пишутся sql запросы, мне надо вылавливать те где содержится надпись: DISTRIBUTED RANDOMLY, содержится она в запросах типа CREATE TABLE, мне нужно выпипить в итоговый отчет какой это шаг (step) и весь запрос.
Выпиливаю awk:
find "$LOGDIR"* -name "*.log" -type f -exec grep -l "DISTRIBUTED RANDOMLY" {} \; |while read DRAN_JOB
do
cat "$DRAN_JOB" |awk '{ if ( $3 ~ /Step:/) { a=$0; b=1}; if ($0 ~ /DISTRIBUTED RANDOMLY/) { if (b==1) { b=0; print("<br>"); print a; print("<br>"); print $0} }}' >>$reportfile
done
Суть работы находи и запинаем строчку с Step если нашли DISTRIBUTED RANDOMLY то выводим строчку какой у нас сейчас шаг и ниже запрос. Проблема в том что запрос идет на несолько строк и по сути я беру только последнюю, это не есть good.
Пример запроса:
CREATE TABLE parampampam (RESULT_CD VARCHAR(3),FLG
VARCHAR(1),CD VARCHAR(3)
и еще около 10 строчек
.....
.....
....
еще такая фигня может посреди запроса вылезти393 The System 02:25 Thursday, December 19, 2013
SMALLINT,bprocess_id SMALLINT,open_i TIMESTAMP) DISTRIBUTED RANDOMLY
Можете пожалуйста посоветовать как мне взять весь запрос?
P.S
в awk не удивляемся "<br>" отчет формирую в виде html-странички
Сейчас его потихоньку допиливаю, но вот столкнулся с проблемой: в лог пишутся sql запросы, мне надо вылавливать те где содержится надпись: DISTRIBUTED RANDOMLY, содержится она в запросах типа CREATE TABLE, мне нужно выпипить в итоговый отчет какой это шаг (step) и весь запрос.
Выпиливаю awk:
find "$LOGDIR"* -name "*.log" -type f -exec grep -l "DISTRIBUTED RANDOMLY" {} \; |while read DRAN_JOB
do
cat "$DRAN_JOB" |awk '{ if ( $3 ~ /Step:/) { a=$0; b=1}; if ($0 ~ /DISTRIBUTED RANDOMLY/) { if (b==1) { b=0; print("<br>"); print a; print("<br>"); print $0} }}' >>$reportfile
done
Суть работы находи и запинаем строчку с Step если нашли DISTRIBUTED RANDOMLY то выводим строчку какой у нас сейчас шаг и ниже запрос. Проблема в том что запрос идет на несолько строк и по сути я беру только последнюю, это не есть good.
Пример запроса:
CREATE TABLE parampampam (RESULT_CD VARCHAR(3),FLG
VARCHAR(1),CD VARCHAR(3)
и еще около 10 строчек
.....
.....
....
еще такая фигня может посреди запроса вылезти393 The System 02:25 Thursday, December 19, 2013
SMALLINT,bprocess_id SMALLINT,open_i TIMESTAMP) DISTRIBUTED RANDOMLY
Можете пожалуйста посоветовать как мне взять весь запрос?
P.S
в awk не удивляемся "<br>" отчет формирую в виде html-странички