2013-12-17 4 views
0

Мой скрипт сообщает о ошибках событий из журнала приложений, системы и безопасности в течение 24 часов. Скрипт занимает в среднем 8 минут для запуска. Я считаю, что эти конкретные высказывания способствуют проблемы:Мой сценарий занимает слишком много времени для запуска

$Lap = Get-EventLog -computername $server -LogName $logname -after (Get-Date).AddHours(-24) 
$Lap | where {$_.entryType -match "Error"} | Sort-Object eventid | 
    group-object eventid | Format-Table Name, Count -auto | fl | 
    out-string | Add-Content $eventlogfile 

Если я заменяю параметр -after с -newest, скрипт работает быстро. Любые мысли о том, почему вышеупомянутое утверждение вносит свой вклад в выполнение сценария, которое нужно запустить?

Редактировать Проведя некоторые исследования, я узнал, что с помощью командлета get-eventlog PS анализирует весь журнал событий.

Мера, как долго это займет, чтобы определить количество ошибок приложения найденную в течение последних 24 часов Measure-Command -Expression {get-eventlog -ComputerName server123 -LogName Application -EntryType Error -after (Get-Date).AddHours(-24)}

Общее время: 54 СЕК

сосчитать, сколько ошибок приложений выписка за последние 24 часа *
$logs1 = get-eventlog -ComputerName server123 -LogName Application -EntryType Error -after (Get-Date).AddHours(-24) $logs1.count

Есть 3 ошибки

measure-command -expression {get-eventlog -ComputerName server123 -logname application -Newest 3 }

43 миллисекунды

Любые мысли о том, почему указания параметра -after с get-eventlog Командлет возвращает результаты гораздо дольше, чем задав параметр -newest ?

+0

Потому что вы слишком много событий в журнале регистрации событий в течение последних 24 часов? – Neolisk

+0

В моем приложении, системе и журнале безопасности есть менее 20,13,7 событий. – iamZel

+0

Примерно 20 записей журнала событий - это то, что вы получаете * после * фильтрации, нет? – vonPryz

ответ

2

Командлет Measure-Command может использоваться, чтобы узнать, сколько времени займет команда. Используйте его, чтобы узнать, что происходит. Разделите скрипт немного, чтобы найти самую дорогую операцию. Что-то вроде так,

Measure-Command -Expression { $Lap = Get-EventLog -computername $server -LogName $logname -after (Get-Date).AddHours(-24) } 
Measure-Command -Expression { $lap2 = $Lap| ? {$_.entryType -match "Error"}} 
Measure-Command -Expression { $Lap3 = $Lap2 |Sort-Object eventid 
# Keep splitting/unsplitting statements until you find the costly one 
Measure-Command -Expression { $Lap3 |group-object eventid|Format-Table Name, Count -auto|fl|out-string|Add-Content $eventlogfile } 
+0

Для выполнения обеих команд требуется примерно 7 минут. 'Measure-Command -Expression {$ Lap = Get-EventLog -computername $ server -LogName $ logname -after (Get-Date) .AddHours (-24)}'. ** ~~~~~~~~~~~~~ ** '$ Lap = Get-EventLog -компьютерное имя $ server -LogName $ logname -EntryType 'Error' -после (Get-Date) .AddHours (-24) } ' – iamZel

3

Перенесите все события последних 24 часов по сети, а затем фильтровать их на локальном компьютере:

$Lap = Get-EventLog -computername $server -LogName $logname -after (Get-Date).AddHours(-24) 
$Lap | where {$_.entryType -match "Error"} | Sort-Object eventid | ...

Выполнение фильтрации непосредственно Get-EventLog должно ускорить процесс, потому что таким образом только событие ошибок последних 24 часов передается по сети:

$Lap = Get-EventLog -Computer $server -LogName $logname -EntryType 'Error' -After (Get-Date).AddHours(-24) 
$Lap | Sort-Object eventid | ...
+1

Это! Всегда фильтруйте в командлете, если это вообще возможно. –

1

Я видел это раньше, и используя -После с большим журналом файлы, безусловно, проблема производительности.

Я использовал номера индексов для ускорения его при выполнении повторяющегося журнала гласит:

$last_index = get-content index_history.txt 

#Get the index number of the last log entry 
$index = (Get-EventLog -ComputerName $_ -LogName $log -newest 1).index 

#calculate number of events to retrieve 
if ($last_index){$n = $index - $last_index} 

#get the log entries 
$Lap = Get-EventLog -computername $server -LogName $logname -Newest $n 

$index | set-content index_history.txt 
Смежные вопросы