mrxMonster |
12-10-2011 15:12 1771816 |
скрипт обработки лог файлов и отправки уведомлений по почте
Вложений: 1
Добрый день.
Помогите в написании скрипта, который будет:
1. Просматривать логи из определённой папки
2. Смотреть на последнюю запись и искать в ней слово "warning"
3. Если слово найдено, то сравнивать дату строчки с текущей датой
4. Если дата строчки не позднее 1 дня то отправлять на мыло всю строчку с данным словом.
Образец лога прилагается:
06.10.2011 9:03:51 GVA-XP002 Warning RAID:1
06.10.2011 11:16:45 GVA-XP002 Warning RAID:1
06.10.2011 11:31:33 GVA-XP002 Warning RAID:1
06.10.2011 11:35:52 GVA-XP002 Warning RAID:1
06.10.2011 12:45:14 GVA-XP002 Warning RAID:1
07.10.2011 12:45:49 GVA-XP002 OK
11.10.2011 13:09:22 GVA-XP002 Warning RAID:2
|
mrxMonster |
02-11-2011 16:10 1787341 |
Подскажите код для поиска слова из текстового файла?
|
mrxMonster |
24-11-2011 14:45 1802425 |
Админы!
Разъясните мне ситуацию, почему ни один человек никоим образом не прокаментировал мои вопросы?
Или мои вопросы слишком сложны для всех???
|
Цитата:
Цитата mrxMonster
Разъясните мне ситуацию, почему ни один человек никоим образом не прокаментировал мои вопросы? »
|
Задача не интересная.
Попробуйте:
Код:
Option Explicit
Const ForReading = 1
Const cdoSendUsingPort = 2
Const cdoBasic = 1
Const strPartSchema = "http://schemas.microsoft.com/cdo/configuration/"
Dim strLog
Dim strLine
Dim dtDateTime
strLog = "E:\Песочница\0092\123.txt"
With WScript.CreateObject("Scripting.FileSystemObject")
If .FileExists(strLog) Then
With .OpenTextFile(strLog, ForReading)
Do Until .AtEndOfStream
strLine = .ReadLine()
Loop
.Close
End With
dtDateTime = CDate(Split(strLine)(0) & " " & Split(strLine)(1))
If DateDiff("d", dtDateTime, Now()) <= 1 Then
If UCase(Split(strLine)(3)) = UCase("Warning") Then
With WScript.CreateObject("CDO.Message")
With .Configuration.Fields
.Item(strPartSchema & "sendusing") = cdoSendUsingPort
.Item(strPartSchema & "smtpauthenticate") = cdoBasic
.Item(strPartSchema & "smtpserver") = "smtp.mail.ru"
.Item(strPartSchema & "smtpserverport") = 25
.Item(strPartSchema & "sendusername") = "login"
.Item(strPartSchema & "sendpassword") = "password"
.Update
End With
.To = "to@mail.com"
.From = "from@mail.com"
.Subject = "Subject"
.TextBody = strLine
.Send
End With
End If
End If
Else
WScript.Echo "File [" & strLog & "] not found"
End If
End With
WScript.Quit 0
Вариант скрипта не оптимален: нужно знать, что это за лог, как часто в него пишется информация, каков его средний размер.
|
mrxMonster |
28-11-2011 16:55 1805015 |
Цитата:
Цитата Iska
Вариант скрипта не оптимален: нужно знать, что это за лог, как часто в него пишется информация, каков его средний размер. »
|
Спасибо огромнейшее за ответ!
Это простой текстовый лог, который пишется другим скриптом из системного журнала. Для каждой машины свой лог, но в одну папку, потому и названия будут схожи у файлов. Информация в него пишется каждый день, вернее при каждом логине системы. Средний размер где то 10 кило для файла(увеличивается с каждой записью).
Я попробовал этот код, последнюю строчку он показыват, но что косаемо проверки его даты тут непонятно. Ни ошибок ни результата.
|
Давайте сначала разберёмся с работоспособностью:
Цитата:
Цитата mrxMonster
Я попробовал этот код, последнюю строчку он показыват, но что косаемо проверки его даты тут непонятно. Ни ошибок ни результата. »
|
Я создал файл «E:\Песочница\0092\123.txt», записал в него предложенный текст, добавил строчку:
Код:
28.11.2011 13:09:22 GVA-XP002 Warning RAID:2
обозначающую сегодняшнюю дату, заменил болванки в:
Код:
With .Configuration.Fields
.Item(strPartSchema & "sendusing") = cdoSendUsingPort
.Item(strPartSchema & "smtpauthenticate") = cdoBasic
.Item(strPartSchema & "smtpserver") = "smtp.mail.ru"
.Item(strPartSchema & "smtpserverport") = 25
.Item(strPartSchema & "sendusername") = "login"
.Item(strPartSchema & "sendpassword") = "password"
.Update
End With
.To = "to@mail.com"
.From = "from@mail.com"
.Subject = "Subject"
.TextBody = strLine
.Send
на реальные данные и запустил скрипт. Письмо было отправлено на заданный адрес. А что у Вас?
|
mrxMonster |
30-11-2011 20:25 1806761 |
Прошу прощения за свою невнимательность, я просто забыл в лог добавить запись с актуальной датой ошибки.
После внесения изменения скрипт отреагировал по другому и выдал ошибку:
Ошибка: Сервер отклонил адрес отправителя. Отклик сервера: 501
sender address must match authenticated user
код: 8004020E
Источник: (null)
Я ещё раз всё проверил и понял, что sendusername и параметр .to должны быть одинаковы.
После скрипт заработал как нужно.
У меня ещё один вопрос:
Как не писать логин и пароль от почты в таком открытом виде? Скрипт будет использоваться в доменном пространстве и мне хотелось бы знать можно ли использовать возможности домена для логина?
|
Цитата:
Цитата mrxMonster
Как не писать логин и пароль от почты в таком открытом виде? »
|
Мне сложно сказать. Обеспечьте хранение скрипта в месте, доступном только администраторам домена. Запускайте его от имени одного из администраторов или системы.
Цитата:
Цитата mrxMonster
Скрипт будет использоваться в доменном пространстве и мне хотелось бы знать можно ли использовать возможности домена для логина? »
|
Поясните, пожалуйста.
|
Update: Решил добавить…
Цитата:
Цитата mrxMonster
Я ещё раз всё проверил и понял, что sendusername и параметр .to должны быть одинаковы. »
|
Раньше потребности в этом не возникало. Но, благодаря вирусописателям и спамерам, рассылавшим всякие гадости от имени «admins@yourdomain.com» и т.п., практически все сервера давно уже требуют этого, как минимальной меры предосторожности.
|
mrxMonster |
02-12-2011 11:20 1807864 |
Кстати, говорилось что бдут несколько логов (у каждой машины свой лог) в одной папке
Цитата:
Цитата mrxMonster
1. Просматривать логи из определённой папки »
|
Как заставить скрипт просматривать их по очереди?
|
Например, так:
Код:
strLog = "E:\Песочница\0092\123.txt"
With WScript.CreateObject("Scripting.FileSystemObject")
For Each strLog In Array("c:\My Log 01.txt", "c:\My Log 02.txt", "c:\My Log 0x.txt")
If .FileExists(strLog) Then
…
End If
Next
End With
Или в папке вовсе только логи и ничего кроме логов?
|
mrxMonster |
03-12-2011 14:59 1808526 |
Цитата:
Цитата Iska
Или в папке вовсе только логи и ничего кроме логов? »
|
Да, папка предназначена только для логов таких как образец, за исключением названия!
|
mrxMonster, ясно. Тогда, возможно, будет удобнее перебором всего, что есть в указанной папке:
Код:
Option Explicit
Const ForReading = 1
Const cdoSendUsingPort = 2
Const cdoBasic = 1
Const strPartSchema = "http://schemas.microsoft.com/cdo/configuration/"
Dim strLog
Dim strLine
Dim dtDateTime
strLogPath = "E:\Песочница\0092"
With WScript.CreateObject("Scripting.FileSystemObject")
If .FolderExists(strLogPath) Then
For Each objFile In .GetFolder(strLogPath).Files
With objFile.OpenAsTextStream(ForReading)
Do Until .AtEndOfStream
strLine = .ReadLine()
Loop
.Close
End With
dtDateTime = CDate(Split(strLine)(0) & " " & Split(strLine)(1))
If DateDiff("d", dtDateTime, Now()) <= 1 Then
If UCase(Split(strLine)(3)) = UCase("Warning") Then
With WScript.CreateObject("CDO.Message")
With .Configuration.Fields
.Item(strPartSchema & "sendusing") = cdoSendUsingPort
.Item(strPartSchema & "smtpauthenticate") = cdoBasic
.Item(strPartSchema & "smtpserver") = "smtp.mail.ru"
.Item(strPartSchema & "smtpserverport") = 25
.Item(strPartSchema & "sendusername") = "login"
.Item(strPartSchema & "sendpassword") = "password"
.Update
End With
.To = "to@mail.com"
.From = "from@mail.com"
.Subject = "Subject"
.TextBody = strLine
.Send
End With
End If
End If
Next
Else
WScript.Echo "Log Folder [" & strLogPath & "] not found"
End If
End With
WScript.Quit 0
Если у всех лог-файлов одинаковое расширение — можно сделать условие, чтобы при переборе отбирались именно файлы с таким расширением (так сказать, некоторая защита от случайно попавших в папку файлов).
|
mrxMonster |
06-12-2011 13:58 1810313 |
В моей папке логов четыре файла. Названия им raidGVA-XP002.log raidGVA-XP061.log raidGVA-XP068.log raidGVA-XP112.log.
В файле raidGVA-XP002.log есть запись, которая должна вызвать отправку сообщения на почту, но скрипт пишет:
Переменная не определена: 'strLogPath'
Что делать? Где править?
|
Если речь про #13, то, очевидно, здесь:
Код:
Dim strLog
Dim strLogPath
|
mrxMonster |
07-12-2011 09:49 1810847 |
Цитата:
Цитата Iska
Если речь про #13, то, очевидно, здесь:
Код:
Dim strLog
Dim strLogPath »
|
Я тоже так сразу подумал, но после этого:
Переменная не определена: 'objFile'
В папке лежат файлы txt и log для верности. Или же тут в другом проблемма?
|
Дело в том, что последний вариант скрипта (#13) я писал «на ощупь», не запуская его для проверки.
Добавить «Dim objFile» туда же, ниже «Dim strLogPath»:
Код:
Dim strLogPath
Dim objFile
P.S. Может быть, переделать для работы только с лог-файлами и по маске? Судя по приведённым Вами выше именам файлов, у них есть постоянная и переменная части в именах.
|
mrxMonster |
07-12-2011 15:18 1811023 |
Я не смог справится ни с первой интеграцией ни со второй. У меня скрипт работает только с указанием на конкретный файл.
Если можно, покажите вариант с перебором всех логов в папке по маске GVA-XP***.log
|
mrxMonster, лады. Только — либо вечером, либо ближе к утру.
|
mrxMonster, пробуйте:
Код:
Option Explicit
Const ForReading = 1
Const cdoSendUsingPort = 2
Const cdoBasic = 1
Const strPartSchema = "http://schemas.microsoft.com/cdo/configuration/"
Dim strLogPath
Dim objFile
Dim objRegExp
Dim strLine
Dim dtDateTime
strLogPath = "E:\Песочница\0098"
Set objRegExp = WScript.CreateObject("VBScript.RegExp")
With objRegExp
.IgnoreCase = True
.Pattern = "GVA-XP\d{3}\.log"
End With
With WScript.CreateObject("Scripting.FileSystemObject")
If .FolderExists(strLogPath) Then
For Each objFile In .GetFolder(strLogPath).Files
If objRegExp.Test(objFile.Name) Then
With objFile.OpenAsTextStream(ForReading)
Do Until .AtEndOfStream
strLine = .ReadLine()
Loop
.Close
End With
dtDateTime = CDate(Split(strLine)(0) & " " & Split(strLine)(1))
If DateDiff("d", dtDateTime, Now()) <= 1 Then
If UCase(Split(strLine)(3)) = UCase("Warning") Then
With WScript.CreateObject("CDO.Message")
With .Configuration.Fields
.Item(strPartSchema & "sendusing") = cdoSendUsingPort
.Item(strPartSchema & "smtpauthenticate") = cdoBasic
.Item(strPartSchema & "smtpserver") = "smtp.mail.ru"
.Item(strPartSchema & "smtpserverport") = 25
.Item(strPartSchema & "sendusername") = "login"
.Item(strPartSchema & "sendpassword") = "password"
.Update
End With
.To = "to@mail.com"
.From = "from@mail.com"
.Subject = "Subject"
.TextBody = strLine
.Send
End With
End If
End If
End If
Next
Else
WScript.Echo "Log Folder [" & strLogPath & "] not found"
End If
End With
WScript.Quit 0
|
mrxMonster |
08-12-2011 12:04 1811532 |
Спасибо огромнейшее! Всё работает как надо!
Немного о том для чего это или вернее к чему это нужно было:
На нескольких компьютерах нашего офиса был поднят программный рейд-1 на WINXP.
Для мониторинга его состояния я кое как состряпал скрипт, смотрящий системный журнал и вытаскивающий оттуда состояние зеркал:
Dim fso, ts
Const ForAppending = 8
CompName = server ' Имя или адрес хоста
FileName="C:\raid.log" ' Имя файла лога
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile(FileName, ForAppending, True)
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent Where Logfile = 'System' and " _
& "EventCode = '2'")
If colLoggedEvents.count>0 Then
ts.WriteLine(Now & " " & CompName & " " & "Warning RAID:" & colLoggedEvents.Count)
Else
ts.WriteLine(Now & " " & CompName & " " & "OK" )
End if
ts.Close
Set ts = Nothing
Set fso = Nothing
А благодаря вашей помощи, я теперь получаю уведомления по почте!
|
Время: 07:52.
© OSzone.net 2001-