Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] скрипт обработки лог файлов и отправки уведомлений по почте (http://forum.oszone.net/showthread.php?t=217784)

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

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

Iska 24-11-2011 21:38 1802677

Цитата:

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

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

Iska 28-11-2011 23:19 1805304

Давайте сначала разберёмся с работоспособностью:
Цитата:

Цитата 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 должны быть одинаковы.
После скрипт заработал как нужно.

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

Iska 30-11-2011 23:19 1806892

Цитата:

Цитата mrxMonster
Как не писать логин и пароль от почты в таком открытом виде? »

Мне сложно сказать. Обеспечьте хранение скрипта в месте, доступном только администраторам домена. Запускайте его от имени одного из администраторов или системы.
Цитата:

Цитата mrxMonster
Скрипт будет использоваться в доменном пространстве и мне хотелось бы знать можно ли использовать возможности домена для логина? »

Поясните, пожалуйста.

Iska 30-11-2011 23:35 1806898

Update: Решил добавить…

Цитата:

Цитата mrxMonster
Я ещё раз всё проверил и понял, что sendusername и параметр .to должны быть одинаковы. »

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

mrxMonster 02-12-2011 11:20 1807864

Кстати, говорилось что бдут несколько логов (у каждой машины свой лог) в одной папке
Цитата:

Цитата mrxMonster
1. Просматривать логи из определённой папки »

Как заставить скрипт просматривать их по очереди?

Iska 02-12-2011 16:25 1808066

Например, так:
Код:

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
Или в папке вовсе только логи и ничего кроме логов? »

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

Iska 03-12-2011 19:35 1808637

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'
Что делать? Где править?

Iska 06-12-2011 16:01 1810398

Если речь про #13, то, очевидно, здесь:
Код:

Dim strLog
Dim strLogPath


mrxMonster 07-12-2011 09:49 1810847

Цитата:

Цитата Iska
Если речь про #13, то, очевидно, здесь:
Код:
Dim strLog
Dim strLogPath »

Я тоже так сразу подумал, но после этого:
Переменная не определена: 'objFile'

В папке лежат файлы txt и log для верности. Или же тут в другом проблемма?

Iska 07-12-2011 12:26 1810920

Дело в том, что последний вариант скрипта (#13) я писал «на ощупь», не запуская его для проверки.

Добавить «Dim objFile» туда же, ниже «Dim strLogPath»:
Код:

Dim strLogPath

Dim objFile

P.S. Может быть, переделать для работы только с лог-файлами и по маске? Судя по приведённым Вами выше именам файлов, у них есть постоянная и переменная части в именах.

mrxMonster 07-12-2011 15:18 1811023

Я не смог справится ни с первой интеграцией ни со второй. У меня скрипт работает только с указанием на конкретный файл.
Если можно, покажите вариант с перебором всех логов в папке по маске GVA-XP***.log

Iska 07-12-2011 15:35 1811033

mrxMonster, лады. Только — либо вечером, либо ближе к утру.

Iska 08-12-2011 09:44 1811467

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.

Время: 07:52.
© OSzone.net 2001-