Как настроить мониторинг в пользовательском журнале событий

На самом деле я хочу добиться следующих трех вещей в моем файле Master.bat:

1.  Collect and redirect all the entries of ‘Application’ event log to an output file.
2.  Search for a specific error message “The system cannot find the file specified” in Application event log and append the whole error message line to a log file.
3.  Send an Email notification to alert me about the error message found on daily basis.

Мастер.bat

wevtutil qe Application >D:\test\Applog.txt 
findstr /i /c:"The system cannot find the file specified" "D:\test\Applog.txt" > "D:\test\errorlog.txt"
PowerShell.exe -file D:\test\Mail.ps1 %1 %2

Mail.ps1

if (Select-String -Path D:\test\Applog.txt -pattern "The system cannot find the file specified") 
{
 function sendMail{
Write-Host "Sending Email"
$smtpServer = "smtp.domain.com"
$msg = new-object Net.Mail.MailMessage
 $smtp = new-object Net.Mail.SmtpClient($smtpServer)
 $msg.From = "[email protected]"
 $msg.To.Add("[email protected] ") 
 $msg.subject = "Error found in log"
 $msg.body = "please check there is a known error in Application log."
$smtp.Send($msg)
 }
sendMail
}
else
{write-host "nothing to process"}

Проблема, с которой я здесь сталкиваюсь, заключается в том, что, к сожалению, в журнале Applog.txt остается тонна данных для просмотра, и когда я планирую Master.bat, я получаю уведомления по электронной почте для сообщений об ошибках, которые произошли много дней назад, чего я не хочу. Я хочу получать уведомления по электронной почте с сообщением об ошибке только на текущую сегодняшнюю дату.

Может ли кто-нибудь помочь мне здесь?


person Sunny    schedule 27.11.2013    source источник
comment
V1 - правда? Это семь лет и 3 оборота позади нынешнего V4. Если вы можете перейти на V3, вы можете использовать Get-WinEvent и делать все в PowerShell.   -  person Keith Hill    schedule 27.11.2013


Ответы (1)


Вы можете сделать это намного проще, перейдя на V3 и используя Get-WinEvent для выполнения всей задачи в сценарии PowerShell, например:

$date = (Get-Date).AddDays(-2)
$pattern = 'The system cannot find the file specified'
$events = Get-WinEvent -LogName Application | 
              Where {$_.TimeCreated -gt $date -and $_.Message -match $pattern} | 
              Out-String -Width 110
if ($events) {
    Send-MailMessage -SmtpServer smtp.domain.com -From [email protected] -To [email protected] -Subject 'Error found in log' -Body $events
}
person Keith Hill    schedule 27.11.2013
comment
@Keith... У меня может быть другая система для запуска этого скрипта, где установлена ​​версия 2.0, но, к сожалению, мне не разрешено обновляться до версии 3.0. Будет ли вышеуказанное решение работать на V2.0? А пока проверяю со своей стороны... - person Sunny; 27.11.2013
comment
Я думаю, вам нужно будет использовать Get-EventLog на V2. - person Keith Hill; 27.11.2013
comment
… Я проверил скрипт в системе V2.0, и хорошо, что Get-WinEvent и Get-EventLog работают отлично, давая один и тот же результат.... :) но моя цель 2-го пункта еще не достигнута, перенаправление ошибки сообщение в отдельный файл журнала, где я должен добавить перенаправление выше..? - person Sunny; 27.11.2013
comment
Приведенный выше сценарий отправляет сообщения об ошибках в теле сообщения. Чтобы поместить их в фейл, сделайте следующее: $events › d:\test\errorlog.txt - person Keith Hill; 27.11.2013
comment
Спасибо, Кит..теперь все прекрасно работает в одной программе…спасибо за помощь..:) - person Sunny; 27.11.2013
comment
К вашему сведению, Санни (Кейт, я полагаю, вы уже это знаете!), -FilterHashTable или -FilterXPath могут сделать поиск намного быстрее (по сравнению с передачей в Where-Object), но их немного сложнее построить. - person Robin; 27.11.2013
comment
@Rob .. да, я согласен, это немного медленно .. не могли бы вы подробно рассказать, как построить -FilterHashTable или -FilterXPath в приведенном выше случае? - person Sunny; 27.11.2013
comment
В разделе справки Get-WinEvent показано несколько примеров использования этих параметров. Выполнить: man get-winevent -full - person Keith Hill; 27.11.2013
comment
Да.. нашел способ использовать -FilterHashTable или -FilterXPath для ускорения поиска....еще раз спасибо...:) - person Sunny; 27.11.2013