Запрос журнала событий с Get-WinEvent / Get-EventLog очень медленный при запросе события завершения работы 1074 - PullRequest
0 голосов
/ 09 марта 2020

Я пишу сценарий PowerShell, который должен иметь возможность получить запрос в журнале событий System и найти события с идентификатором события 1074 , который указывает на завершение работы.

Для этого я использовал следующий код, однако заметил, что при запуске кода на серверах с большими System журналами событий выполнение команды занимает много секунд.

Get-WinEvent -LogName 'System' | Where-Object { $_.Id -eq 1074 }

Есть ли способ улучшить производительность этого кода?

1 Ответ

3 голосов
/ 09 марта 2020

Get-WinEvent против Get-EventLog

Первое повышение производительности, которое вы можете получить, это использование Get-WinEvent над Get-EventLog. Это потому, что Get-WinEvent заменяет Get-EventLog, а должен работать лучше .

Правильная фильтрация запроса

Я нашел fantasti c статья Эд Уилсона , в которой подробно рассказывается о том, как можно повысить производительность запроса, подобного тому, который я опубликовал выше. Я выделю настройки производительности, которые я сделал, чтобы значительно улучшить производительность моего сценария.

  1. Не используйте параметр -LogName, а скорее используйте соответствующий -ProviderName провайдера, который генерирует событие, которое вы ищете (в блоге Эда подробно рассказывается, как это найти). В моем случае мне нужно было использовать провайдера User32, поскольку именно этот провайдер генерирует интересующее меня событие 1074.
  2. Избегайте полного обхода данных, если это возможно. Вы заметите, что в моем сценарии есть предложение Where-Object. Этот пункт будет перебирать все передаваемые в него события, ища только те, которые имеют 1074 Id. Чтобы избежать этого, Get-WinEvent имеет параметр -FilterHashtable , который можно использовать для фильтрации результатов запроса в командлете Get-WinEvent, что повышает эффективность. Как указано в документации Microsoft: "При работе с большими журналами событий неэффективно отправлять объекты по конвейеру команде Where-Object."

Код

Я реализовал вышеупомянутые концепции и рассчитал улучшения для каждого из них, чтобы показать разницу в производительности с помощью командлета Measure-Command с параметром -Expression. Обратите внимание, что машина, на которой я тестирую, имеет 23 581 событие в журнале System.

Baseline

Measure-Command -Expression {
    Get-WinEvent -LogName 'System' | Where-Object { $_.Id -eq 1074 }
}

# TotalSeconds      : 7.600536

Использование ProviderName против LogName

Measure-Command -Expression {
    Get-WinEvent -ProviderName 'User32' | Where-Object { $_.Id -eq 1074 }
}

# TotalSeconds      : 0.1929325

Использование FilterHashtable

Measure-Command -Expression {
    Get-WinEvent -FilterHashtable @{ProviderName = "User32"; Id = 1074} 
}

# TotalSeconds      : 0.1578928
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...