Как я могу использовать powershell для отслеживания определенного журнала событий Windows? Является ли это возможным?
Powershell - хвостовой журнал событий Windows? Является ли это возможным?
Ответы (3)
Я делал это при случае:
$idx = (get-eventlog -LogName System -Newest 1).Index
while ($true)
{
start-sleep -Seconds 1
$idx2 = (Get-EventLog -LogName System -newest 1).index
get-eventlog -logname system -newest ($idx2 - $idx) | sort index
$idx = $idx2
}
Согласно документам MSDN:
Get-WinEvent
предназначен для замены командлетаGet-EventLog
на компьютерах под управлением Windows Vista и более поздних версий Windows.Get-EventLog
получает события только в классических журналах событий.Get-EventLog
сохраняется в Windows PowerShell для обратной совместимости.
И, побуждаемый моей собственной потребностью следить за неклассическим журналом событий (будет ли это журнал событий в стиле модерн, случайно?), вот удивительно краткий код @mjolinor, перепрофилированный использовать Get-WinEvent
:
Set-PSDebug -Strict
function Get-WinEventTail($LogName, $ShowExisting=10) {
if ($ShowExisting -gt 0) {
$data = Get-WinEvent -provider $LogName -max $ShowExisting
$data | sort RecordId
$idx = $data[0].RecordId
}
else {
$idx = (Get-WinEvent -provider $LogName -max 1).RecordId
}
while ($true)
{
start-sleep -Seconds 1
$idx2 = (Get-WinEvent -provider $LogName -max 1).RecordId
if ($idx2 -gt $idx) {
Get-WinEvent -provider $LogName -max ($idx2 - $idx) | sort RecordId
}
$idx = $idx2
# Any key to terminate; does NOT work in PowerShell ISE!
if ($Host.UI.RawUI.KeyAvailable) { return; }
}
}
Я добавил несколько наворотов для удобства:
- По умолчанию сначала отображаются последние 10 строк журнала, а затем объединяются новые записи по мере их появления — вы можете настроить это на любое число с помощью параметра
ShowExisting
. - Он сортирует записи с самыми старыми первыми (в отличие от
Get-WinEvent
по умолчанию) из-за естественного порядка, которого требует хвост. - Вы можете нажать любую клавишу для завершения (но не в PowerShellISE).
Во-первых, спасибо Михаил!
Небольшое усовершенствование для моего варианта использования, которое включает отображение всего значения многострочного сообщения.
function Get-WinEventTail($Provider="JobRequestQueueConsumerBackgroundService", $ShowExisting=10) {
$formatProperty = @{ expression={$_.TimeCreated}; label="TimeCreated"},
@{ expression={$_.Message}; label="Message"; width=100}
if ($ShowExisting -gt 0) {
$data = Get-WinEvent -ProviderName $Provider -max $ShowExisting
if ($data) {
$data | sort RecordId | Format-Table -Property $formatProperty -Wrap
$idx = $data[0].RecordId
}
}
else {
$idx = (Get-WinEvent -ProviderName $Provider -max 1).RecordId
}
while ($true)
{
start-sleep -Seconds 1
$idx2 = (Get-WinEvent -ProviderName $Provider -max 1).RecordId
if ($idx2 -gt $idx) {
Get-WinEvent -ProviderName $Provider -max ($idx2 - $idx) | sort RecordId | Format-Table -Property $formatProperty -Wrap
}
$idx = $idx2
# Any key to terminate; does NOT work in PowerShell ISE!
if ($Host.UI.RawUI.KeyAvailable) { return; }
}
}
Get-WinEventTail
Параметр -Wrap
был необходим для отображения многострочного сообщения, иначе многоточие обрезало бы сообщение в конце первой строки. Настройка ширины столбца НЕ помогла.