Показать полную графическую версию : На СМД/повершеле требуется написать анализатор логов
На СМД/повершеле требуется написать анализатор логов.
В логе, при наличии в строке определенного слова отсылать почтовое сообщение (это в идеале), или хотябы делать отчет, например, в файл
Затык в том, что лог пополнятся, и его нужно анализировать каждый раз не полностью, а с последнего момента.
В общем требуется помощь, не могу сообразить, может вообще приналичии этого слова всю строку вырезать и вставлять в новый файл...в общем примеры и мысли будут нужны
Образец лога, упакованного в архив. Что является единицей записи лога, какие поля являются ключевыми для записи. Как происходит вытеснение записей/урезание лога. Пример «определённого слова».
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, я не в курсе что вы были/есть "пишущим", я думал тут форум с обсуждением, а не заказ скриптов, мне было б неудобно что б кто-то его писал, особенно с негативом.
Iska, лог в архиве, еденица записи лога - строка, записи в лог добавляются построчно, раз в неделю лог архивируется, создается с таким же именем новый, определенное слово "333"
Iska, я не в курсе что вы были/есть "пишущим" »
Раз я пишу, я прошу выложить в архиве — значит мне и судить, нужен он или нет.
я думал тут форум с обсуждением, а не заказ скриптов, мне было б неудобно что б кто-то его писал, особенно с негативом. »
Где Вы видите «негатив»?!
Kushtym, это образец реального лога? Как по мне, так та же белиберда, что выкладывалась выше. Желателен образец реального лога.
Кроме того, непонятно, как, каким образом опознать момент «раз в неделю».
Дано описано в полном объеме, есть возможность - помогите, нет - давайте не будем задавать стопицот вопросов не по делу, задача корректно описана в первом посте.
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 ==========================================================================
Дано описано в полном объеме, есть возможность - помогите, нет - давайте не будем задавать стопицот вопросов не по делу, задача корректно описана в первом посте.
»
Я Вам уже писал выше: по делу или нет вопросы — решать мне. Не хотите отвечать — дело Ваше. Только не обессудьте, что на Ваши вопросы я отвечу ровно так же — «ничо не знаю, у меня на приведённой белиберде всё работает». И, да — поскольку Вы проигнорировали:
как, каким образом опознать момент «раз в неделю». »
решайте сие сами.
Делаю разбор скрипта написанного господином 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
Слишком много аргументов в командной строке.
Слишком много аргументов в командной строке.
Буду разбираться дальше
Kushtym, это обычный пакетный файл. Не скрипт PowerShell.
Да, я как раз дописывал, что затормозил
Но выдается ошибка:
D:\Work>analyze.cmd
Слишком много аргументов в командной строке.
Слишком много аргументов в командной строке. »
Приведите тогда Ваш код.
То же, что рекомендовали вы
@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 ==========================================================================
Kushtym, у меня работает.
Ситуация такая, в Windows 7 64 bit - не работает, с ошибками которые указаны выше
В 2008 32бит работает, без ошибок, ветерану Iska - благодарность, очень выручили и помогли.
Единственное что, для тех кто будет пользоваться, в папке со скриптом создается ини файлик, в котором помещается отметка о последней проанализированной строке и если лог у вас архивируется/удаляется и т.д. а на месте создается новый - то скрипт работать не будет
Если вам Iska не сложно, предложите какое-либо простое решение, в прочих случаях можно придумать удаление этого ини файла - это уже мои мысли, не разработчика
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.