Powershell - хвостовой журнал событий Windows? Является ли это возможным?

Как я могу использовать powershell для отслеживания определенного журнала событий Windows? Является ли это возможным?


person Kit Ho    schedule 07.03.2013    source источник
comment
Хвост? Как ионный монитор? Или получить хвост конкретного события?   -  person Austin T French    schedule 07.03.2013


Ответы (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
  }
person mjolinor    schedule 07.03.2013
comment
Извините, первый сценарий, который я разместил, был неправильным. Вы можете проверить это, запустив его, а затем несколько раз перезапустив службу w32time, чтобы увидеть результат. - person mjolinor; 07.03.2013

Согласно документам 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).
person Michael Sorens    schedule 03.05.2013

Во-первых, спасибо Михаил!

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

    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 был необходим для отображения многострочного сообщения, иначе многоточие обрезало бы сообщение в конце первой строки. Настройка ширины столбца НЕ помогла.

person user1756588    schedule 30.09.2020