PDA

Показать полную графическую версию : На СМД/повершеле требуется написать анализатор логов


Kushtym
19-02-2014, 21:07
На СМД/повершеле требуется написать анализатор логов.
В логе, при наличии в строке определенного слова отсылать почтовое сообщение (это в идеале), или хотябы делать отчет, например, в файл
Затык в том, что лог пополнятся, и его нужно анализировать каждый раз не полностью, а с последнего момента.

В общем требуется помощь, не могу сообразить, может вообще приналичии этого слова всю строку вырезать и вставлять в новый файл...в общем примеры и мысли будут нужны

Iska
20-02-2014, 01:11
Образец лога, упакованного в архив. Что является единицей записи лога, какие поля являются ключевыми для записи. Как происходит вытеснение записей/урезание лога. Пример «определённого слова».

Kushtym
24-02-2014, 14:49
Iska, спс за ответ

пример лога - нет смысла его кидать в архив...

Log:
skdjfh jkhk - 34290 jhfs kjkk sdfsiu 324 kjsdf
kljs 778 lkdjfs 897453 ksdnf 89347 lkj lj lj
jdj 87 3 jhdsjfhks 333 lsdkl;'' lkjklj kj
askda kljasd lj kl asda lklkad asda

Аналогичного плана строчки будут добавляться, при появлении числа "333" - мне нужно получить уведомление со строкой, содержащей это число, желательно на почту.

Пока я не могу придумать как это сделать - первый вариант, это просто тупо вырезать и копировать эти сообщения в другой джокумент, таким образом не надо будет учитывать старые сообщения при регулярном анализе лога
Второй вариант - это механизм анаолиза лога, с "закладками" или по разнице его изменения или по инзменению его размера.... - то есть не удалять строки, но каким-то образорм их учитывать

Iska
24-02-2014, 15:14
нет смысла его кидать в архив... »
Позвольте пишущему судить об этом.

Вы либо отвечаете на вопросы и делаете, что Вас просят, либо… Впрочем, без всякого «либо».

Kushtym
24-02-2014, 15:26
Iska, я не в курсе что вы были/есть "пишущим", я думал тут форум с обсуждением, а не заказ скриптов, мне было б неудобно что б кто-то его писал, особенно с негативом.

Iska, лог в архиве, еденица записи лога - строка, записи в лог добавляются построчно, раз в неделю лог архивируется, создается с таким же именем новый, определенное слово "333"

Iska
01-03-2014, 23:54
Iska, я не в курсе что вы были/есть "пишущим" »
Раз я пишу, я прошу выложить в архиве — значит мне и судить, нужен он или нет.

я думал тут форум с обсуждением, а не заказ скриптов, мне было б неудобно что б кто-то его писал, особенно с негативом. »
Где Вы видите «негатив»?!

Kushtym, это образец реального лога? Как по мне, так та же белиберда, что выкладывалась выше. Желателен образец реального лога.

Кроме того, непонятно, как, каким образом опознать момент «раз в неделю».

Kushtym
02-03-2014, 00:04
Дано описано в полном объеме, есть возможность - помогите, нет - давайте не будем задавать стопицот вопросов не по делу, задача корректно описана в первом посте.
Iska, проанализируйте белиберду

Iska
02-03-2014, 17:50
Iska, проанализируйте белиберду »
Да пожалуйста:
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=E:\Песочница\0366\log.txt
set sIniFile=%~dpn0.ini

set sPattern=333

if exist "%sIniFile%" (
<"%sIniFile%" set /p sVar=
set /a lLinesForSkip = !sVar!
) else (
set /a lLinesForSkip = 1
)

call :GetTemporaryName

if exist "%sSourceFile%" (
type "%sSourceFile%" | more +%lLinesForSkip% | findstr.exe /r /c:"%sPattern%" >"%TemporaryName%" && "%ProgramFiles%\Blat\blat.exe" "%TemporaryName%" -server "smtp.server.com" -f "from@server.com" -u "login" -pw "password" -to "to@toserver.com" -s "Pattern [%sPattern%] found"
for /f "usebackq delims=" %%i in (`type "%sSourceFile%" ^| more +%lLinesForSkip% ^| find.exe /v /c ""`) do set /a lLinesForSkip += %%i - 1
>"%sIniFile%" echo !lLinesForSkip!
del /f /q "%TemporaryName%"
) else (
echo Source file [%sSourceFile%] not found.
exit /b 1
)

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
setlocal enableextensions enabledelayedexpansion

:NextName
set sTempName=%temp%\temp%random%.tmp

if exist "%sTempName%" goto :NextName

set sProcName=%~0

endlocal & set %sProcName:~4%=%sTempName%
exit /b 0
rem ==========================================================================

Дано описано в полном объеме, есть возможность - помогите, нет - давайте не будем задавать стопицот вопросов не по делу, задача корректно описана в первом посте.
»
Я Вам уже писал выше: по делу или нет вопросы — решать мне. Не хотите отвечать — дело Ваше. Только не обессудьте, что на Ваши вопросы я отвечу ровно так же — «ничо не знаю, у меня на приведённой белиберде всё работает». И, да — поскольку Вы проигнорировали:
как, каким образом опознать момент «раз в неделю». »
решайте сие сами.

Kushtym
11-03-2014, 16:08
Делаю разбор скрипта написанного господином Iska, для тех, кому нужно решать аналогичные задачи.

Еще раз, имеем задачу:
анализировать лог-файл, который будет постоянно наполняться новыми строками, при появлении нужного слова, мы должны получать уведомление, желательно на почту.

Данный скрипт порекомендовал нам Iska:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=E:\Песочница\0366\log.txt
set sIniFile=%~dpn0.ini

set sPattern=333

if exist "%sIniFile%" (
<"%sIniFile%" set /p sVar=
set /a lLinesForSkip = !sVar!
) else (
set /a lLinesForSkip = 1
)

call :GetTemporaryName

if exist "%sSourceFile%" (
type "%sSourceFile%" | more +%lLinesForSkip% | findstr.exe /r /c:"%sPattern%" >"%TemporaryName%" && "%ProgramFiles%\Blat\blat.exe" "%TemporaryName%" -server "smtp.server.com" -f "from@server.com" -u "login" -pw "password" -to "to@toserver.com" -s "Pattern [%sPattern%] found"
for /f "usebackq delims=" %%i in (`type "%sSourceFile%" ^| more +%lLinesForSkip% ^| find.exe /v /c ""`) do set /a lLinesForSkip += %%i - 1
>"%sIniFile%" echo !lLinesForSkip!
del /f /q "%TemporaryName%"
) else (
echo Source file [%sSourceFile%] not found.
exit /b 1
)

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
setlocal enableextensions enabledelayedexpansion

:NextName
set sTempName=%temp%\temp%random%.tmp

if exist "%sTempName%" goto :NextName

set sProcName=%~0

endlocal & set %sProcName:~4%=%sTempName%
exit /b 0
rem ==========================================================================

В котором нам надо указать путь к исходному файлу set sSourceFile=
исходное слово set sPattern=
Так же потребуется маленькая программа blat для консольной отправки имейла, скачать можно отсюда (http://sourceforge.net/projects/blat/files/), распаковать в програмфайлз в папку blat
В скрипте -server "smtp.server.com" -f "from@server.com" -u "login" -pw "password" -to "to@toserver.com" потребуется указать адрес СМТП сервера, исходящий ящик, логин к ящику и пароль.

Проведя все подготовтельные мероприятия скрипт НЕ заработал
Первоначальные ошибки:
.\analyze.ps1
Оператор с символом "@" нельзя использовать в качестве ссылочной переменной в выражении. "@echo" может использоваться только как аргумент для команды. Для ссылочных переменных в выражении следует использовать "$echo".

Если исправить на $echo, получаем следующую ошибку:
.\analyze.ps1
Неожиданный токен "off" в выражении или инструкции.
D:\Work\analyze.ps1:1 знак:10

Если убрать off получаем:
[CODE].\analyze.ps1
Отсутствует "'(" в инструкции if после "if".
D:\Work\analyze.ps1:9 знак:4[CODE]

Опять же скрипт НЕ работает, протестировано на версии
Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1

Буду разбираться

UPD
Запустил через CMD, ведь господин Iska писал мне под CMD, а я затормозил... все инструкции как и выше, только сохраняем и запускаем через консоль

Но выдается ошибка:

D:\Work>analyze.cmd
Слишком много аргументов в командной строке.
Слишком много аргументов в командной строке.

Буду разбираться дальше

Iska
11-03-2014, 16:33
Kushtym, это обычный пакетный файл. Не скрипт PowerShell.

Kushtym
11-03-2014, 16:41
Да, я как раз дописывал, что затормозил

Iska
11-03-2014, 16:50
Но выдается ошибка:
D:\Work>analyze.cmd
Слишком много аргументов в командной строке.
Слишком много аргументов в командной строке. »
Приведите тогда Ваш код.

Kushtym
11-03-2014, 16:55
То же, что рекомендовали вы

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=D:\Work\log.txt
set sIniFile=%~dpn0.ini

set sPattern=333

if exist "%sIniFile%" (
<"%sIniFile%" set /p sVar=
set /a lLinesForSkip = !sVar!
) else (
set /a lLinesForSkip = 1
)

call :GetTemporaryName

if exist "%sSourceFile%" (
type "%sSourceFile%" | more +%lLinesForSkip% | findstr.exe /r /c:"%sPattern%" >"%TemporaryName%" && "%ProgramFiles%\Blat\blat.exe" "%TemporaryName%" -server "mail.host.net" -f "mail@host.com" -u "mail@host.com" -pw "gfhfljrc" -to "mail@gmail.com" -s "Pattern [%sPattern%] found"
for /f "usebackq delims=" %%i in (`type "%sSourceFile%" ^| more +%lLinesForSkip% ^| find.exe /v /c ""`) do set /a lLinesForSkip += %%i - 1
>"%sIniFile%" echo !lLinesForSkip!
del /f /q "%TemporaryName%"
) else (
echo Source file [%sSourceFile%] not found.
exit /b 1
)

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
setlocal enableextensions enabledelayedexpansion

:NextName
set sTempName=%temp%\temp%random%.tmp

if exist "%sTempName%" goto :NextName

set sProcName=%~0

endlocal & set %sProcName:~4%=%sTempName%
exit /b 0
rem ==========================================================================

Iska
11-03-2014, 17:02
Kushtym, у меня работает.

Kushtym
11-03-2014, 17:23
Ситуация такая, в Windows 7 64 bit - не работает, с ошибками которые указаны выше
В 2008 32бит работает, без ошибок, ветерану Iska - благодарность, очень выручили и помогли.
Единственное что, для тех кто будет пользоваться, в папке со скриптом создается ини файлик, в котором помещается отметка о последней проанализированной строке и если лог у вас архивируется/удаляется и т.д. а на месте создается новый - то скрипт работать не будет

Если вам Iska не сложно, предложите какое-либо простое решение, в прочих случаях можно придумать удаление этого ини файла - это уже мои мысли, не разработчика




© OSzone.net 2001-2012