[Bash]Анализатор лог файлов (Скрипт для анализа логов и сортировки только самой нужной информации.)

Модератор: Модераторы разделов

rydj
Сообщения: 27

[Bash]Анализатор лог файлов

Сообщение rydj »

Доброго времени суток. Есть программа которая после отработки записывает кучу лог файлов в них содержится такая информация:
****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
Модератор
Сообщения: 21472
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: [Bash]Анализатор лог файлов

Сообщение Bizdelnick »

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]Анализатор лог файлов

Сообщение rydj »

Код: Выделить всё

#!/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 »

А всё, двойные кавычки спасли, спасибо.
Спасибо сказали:
rydj
Сообщения: 27

Re: [Bash]Анализатор лог файлов

Сообщение rydj »

Написал скрипт:

Код: Выделить всё

#!/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
Модератор
Сообщения: 21472
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: [Bash]Анализатор лог файлов

Сообщение Bizdelnick »

rydj писал(а):
18.10.2013 12:30
1. папки с пробелами.

Ну так ведь
rydj писал(а):
16.10.2013 16:22
двойные кавычки спасли
Если не совсем спасли, значит, не везде их поставили, где надо.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
rydj
Сообщения: 27

Re: [Bash]Анализатор лог файлов

Сообщение rydj »

Bizdelnick писал(а):
18.10.2013 12:36
rydj писал(а):
18.10.2013 12:30
1. папки с пробелами.

Ну так ведь
rydj писал(а):
16.10.2013 16:22
двойные кавычки спасли
Если не совсем спасли, значит, не везде их поставили, где надо.

Пробовал и так и сяк, если после даты ставить * то срабатывает а если "/projects/jobs/DATE_NAMEDIR 00-1*" то не катит причем пробовал ставить обратный слеш:
"/projects/jobs/DATE_NAMEDIR\ 00-1*" тоже ничего не дало(((
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21472
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: [Bash]Анализатор лог файлов

Сообщение Bizdelnick »

rydj писал(а):
18.10.2013 12:41
причем пробовал ставить обратный слеш:
"/projects/jobs/$DATE_NAMEDIR\ 00-1*" тоже ничего не дало(((

В таком варианте, но без кавычек, должно работать. Но лучше так: "/projects/jobs/$DATE_NAMEDIR 00-1"*
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
rydj
Сообщения: 27

Re: [Bash]Анализатор лог файлов

Сообщение rydj »

Bizdelnick писал(а):
18.10.2013 12:50
rydj писал(а):
18.10.2013 12:41
причем пробовал ставить обратный слеш:
"/projects/jobs/$DATE_NAMEDIR\ 00-1*" тоже ничего не дало(((

В таком варианте, но без кавычек, должно работать. Но лучше так: "/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
Модератор
Сообщения: 21472
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: [Bash]Анализатор лог файлов

Сообщение Bizdelnick »

Вы лишних * напихали. Уберите отсюда:
rydj писал(а):
18.10.2013 12:30
DATE_NAMEDIR="`date +%Y-%m-%d` 00-1*"

А здесь добавите кавычки, как я писал:
rydj писал(а):
18.10.2013 12:30
LOGDIR=projects/jobs/$DATE_NAMEDIR*

Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
rydj
Сообщения: 27

Re: [Bash]Анализатор лог файлов

Сообщение rydj »

Код: Выделить всё

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]Анализатор лог файлов

Сообщение rydj »

Всё разобрался. вот:
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]Анализатор лог файлов

Сообщение rydj »

Появился еще вопрос по скрипту.

Код: Выделить всё

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]Анализатор лог файлов

Сообщение rydj »

Идея у меня кажется появилась, только реализация не выходит, может предварительно искать в файле ошибки грепом, если греп нашел строчки то &?=1 если не нашел то 0. Значит если есть ошибка в логе то пишем имя и начинаем обработку awk если нет переходим к след файлу. Как только реализовать?
Спасибо сказали:
rydj
Сообщения: 27

Re: [Bash]Анализатор лог файлов

Сообщение rydj »

Мастера unix можете поделится мудростью.
Мне нужно чтобы find искал в директории все логи созданные или измененные за последние 24часа.
Команда правильная?
find "$LOGDIR"* -mtime 0 -type f -name '*.log' -print
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [Bash]Анализатор лог файлов

Сообщение drBatty »

rydj писал(а):
24.10.2013 18:41
Команда правильная?
find "$LOGDIR"* -mtime 0 -type f -name '*.log' -print

1. путь без всяких звёздочек. просто "$LOGDIR" (можно без кавычек, может вам надо именно это)
2. mtime -1 это за сутки.
3. -name должно быть сначала (это не принципиально, просто быстрее проверять только логи, а не всё, и потом убирать всё кроме логов, как вы делаете). Касается и type -f.
4. print не нужно. Оно дефолт.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
rydj
Сообщения: 27

Re: [Bash]Анализатор лог файлов

Сообщение rydj »

В продолжение темы, про анализатор логов. Он у меня работает и процветает благодаря вам спасибо =)
Сейчас его потихоньку допиливаю, но вот столкнулся с проблемой: в лог пишутся 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 строчек
.....
.....
....

&#12;еще такая фигня может посреди запроса вылезти393 The System 02:25 Thursday, December 19, 2013
SMALLINT,bprocess_id SMALLINT,open_i TIMESTAMP) DISTRIBUTED RANDOMLY


Можете пожалуйста посоветовать как мне взять весь запрос?

P.S
в awk не удивляемся "<br>" отчет формирую в виде html-странички
Спасибо сказали:
rydj
Сообщения: 27

Re: [Bash]Анализатор лог файлов

Сообщение rydj »

народ, идей совсем нет? :(
Спасибо сказали: