Войти

Показать полную графическую версию : [решено] скрипт обработки лог файлов и отправки уведомлений по почте


Страниц : [1] 2

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
Админы!
Разъясните мне ситуацию, почему ни один человек никоим образом не прокаментировал мои вопросы?
Или мои вопросы слишком сложны для всех???

Iska
24-11-2011, 21:38
Разъясните мне ситуацию, почему ни один человек никоим образом не прокаментировал мои вопросы? »
Задача не интересная.

Попробуйте:
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 кило для файла(увеличивается с каждой записью).

Я попробовал этот код, последнюю строчку он показыват, но что косаемо проверки его даты тут непонятно. Ни ошибок ни результата.

Iska
28-11-2011, 23:19
Давайте сначала разберёмся с работоспособностью:
Я попробовал этот код, последнюю строчку он показыват, но что косаемо проверки его даты тут непонятно. Ни ошибок ни результата. »
Я создал файл «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 должны быть одинаковы.
После скрипт заработал как нужно.

У меня ещё один вопрос:
Как не писать логин и пароль от почты в таком открытом виде? Скрипт будет использоваться в доменном пространстве и мне хотелось бы знать можно ли использовать возможности домена для логина?

Iska
30-11-2011, 23:19
Как не писать логин и пароль от почты в таком открытом виде? »
Мне сложно сказать. Обеспечьте хранение скрипта в месте, доступном только администраторам домена. Запускайте его от имени одного из администраторов или системы.
Скрипт будет использоваться в доменном пространстве и мне хотелось бы знать можно ли использовать возможности домена для логина? »
Поясните, пожалуйста.

Iska
30-11-2011, 23:35
Update: Решил добавить…

Я ещё раз всё проверил и понял, что sendusername и параметр .to должны быть одинаковы. »
Раньше потребности в этом не возникало. Но, благодаря вирусописателям и спамерам, рассылавшим всякие гадости от имени «admins@yourdomain.com» и т.п., практически все сервера давно уже требуют этого, как минимальной меры предосторожности.

mrxMonster
02-12-2011, 11:20
Кстати, говорилось что бдут несколько логов (у каждой машины свой лог) в одной папке
1. Просматривать логи из определённой папки »
Как заставить скрипт просматривать их по очереди?

Iska
02-12-2011, 16:25
Например, так:
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
Или в папке вовсе только логи и ничего кроме логов? »

Да, папка предназначена только для логов таких как образец, за исключением названия!

Iska
03-12-2011, 19:35
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'
Что делать? Где править?

Iska
06-12-2011, 16:01
Если речь про #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 для верности. Или же тут в другом проблемма?

Iska
07-12-2011, 12:26
Дело в том, что последний вариант скрипта (#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

Iska
07-12-2011, 15:35
mrxMonster, лады. Только — либо вечером, либо ближе к утру.

Iska
08-12-2011, 09:44
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