Показать полную графическую версию : [решено] скрипт обработки лог файлов и отправки уведомлений по почте
mrxMonster
12-10-2011, 15:12
Добрый день.
Помогите в написании скрипта, который будет:
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
Подскажите код для поиска слова из текстового файла?
mrxMonster
24-11-2011, 14:45
Админы!
Разъясните мне ситуацию, почему ни один человек никоим образом не прокаментировал мои вопросы?
Или мои вопросы слишком сложны для всех???
Разъясните мне ситуацию, почему ни один человек никоим образом не прокаментировал мои вопросы? »
Задача не интересная.
Попробуйте:
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
Вариант скрипта не оптимален: нужно знать, что это за лог, как часто в него пишется информация, каков его средний размер. »
Спасибо огромнейшее за ответ!
Это простой текстовый лог, который пишется другим скриптом из системного журнала. Для каждой машины свой лог, но в одну папку, потому и названия будут схожи у файлов. Информация в него пишется каждый день, вернее при каждом логине системы. Средний размер где то 10 кило для файла(увеличивается с каждой записью).
Я попробовал этот код, последнюю строчку он показыват, но что косаемо проверки его даты тут непонятно. Ни ошибок ни результата.
Давайте сначала разберёмся с работоспособностью:
Я попробовал этот код, последнюю строчку он показыват, но что косаемо проверки его даты тут непонятно. Ни ошибок ни результата. »
Я создал файл «E:\Песочница\0092\123.txt», записал в него предложенный (http://forum.oszone.net/post-1771816.html#post1771816) текст, добавил строчку:
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
Прошу прощения за свою невнимательность, я просто забыл в лог добавить запись с актуальной датой ошибки.
После внесения изменения скрипт отреагировал по другому и выдал ошибку:
Ошибка: Сервер отклонил адрес отправителя. Отклик сервера: 501
sender address must match authenticated user
код: 8004020E
Источник: (null)
Я ещё раз всё проверил и понял, что sendusername и параметр .to должны быть одинаковы.
После скрипт заработал как нужно.
У меня ещё один вопрос:
Как не писать логин и пароль от почты в таком открытом виде? Скрипт будет использоваться в доменном пространстве и мне хотелось бы знать можно ли использовать возможности домена для логина?
Как не писать логин и пароль от почты в таком открытом виде? »
Мне сложно сказать. Обеспечьте хранение скрипта в месте, доступном только администраторам домена. Запускайте его от имени одного из администраторов или системы.
Скрипт будет использоваться в доменном пространстве и мне хотелось бы знать можно ли использовать возможности домена для логина? »
Поясните, пожалуйста.
Update: Решил добавить…
Я ещё раз всё проверил и понял, что sendusername и параметр .to должны быть одинаковы. »
Раньше потребности в этом не возникало. Но, благодаря вирусописателям и спамерам, рассылавшим всякие гадости от имени «admins@yourdomain.com» и т.п., практически все сервера давно уже требуют этого, как минимальной меры предосторожности.
mrxMonster
02-12-2011, 11:20
Кстати, говорилось что бдут несколько логов (у каждой машины свой лог) в одной папке
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
Или в папке вовсе только логи и ничего кроме логов? »
Да, папка предназначена только для логов таких как образец, за исключением названия!
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
В моей папке логов четыре файла. Названия им raidGVA-XP002.log raidGVA-XP061.log raidGVA-XP068.log raidGVA-XP112.log.
В файле raidGVA-XP002.log есть запись, которая должна вызвать отправку сообщения на почту, но скрипт пишет:
Переменная не определена: 'strLogPath'
Что делать? Где править?
Если речь про #13 (http://forum.oszone.net/post-1808637-13.html), то, очевидно, здесь:
Dim strLog
Dim strLogPath
mrxMonster
07-12-2011, 09:49
Если речь про #13, то, очевидно, здесь:
Код:
Dim strLog
Dim strLogPath »
Я тоже так сразу подумал, но после этого:
Переменная не определена: 'objFile'
В папке лежат файлы txt и log для верности. Или же тут в другом проблемма?
Дело в том, что последний вариант скрипта (#13 (http://forum.oszone.net/post-1808637-13.html)) я писал «на ощупь», не запуская его для проверки.
Добавить «Dim objFile» туда же, ниже «Dim strLogPath»:
Dim strLogPath
Dim objFile
P.S. Может быть, переделать для работы только с лог-файлами и по маске? Судя по приведённым Вами выше именам файлов, у них есть постоянная и переменная части в именах.
mrxMonster
07-12-2011, 15:18
Я не смог справится ни с первой интеграцией ни со второй. У меня скрипт работает только с указанием на конкретный файл.
Если можно, покажите вариант с перебором всех логов в папке по маске 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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.