Powershell - 尾巴Windows事件日志?可能吗?

时间:2013-03-07 02:52:48

标签: windows powershell event-log tail

如何使用powershell来拖尾特定的Windows事件日志? 有可能吗?

3 个答案:

答案 0 :(得分:7)

我偶尔也这样做过:

$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
  }

答案 1 :(得分:3)

根据MSDN文档:

  

Get-WinEvent旨在替换Get-EventLog cmdlet   运行Windows Vista和更高版本Windows的计算机。   Get-EventLog仅在经典事件日志中获取事件。 Get-EventLog是   保留在Windows PowerShell中以实现向后兼容。

由于我自己需要尾随一个 - 经典事件日志(那将是事件日志nouveau 偶然吗?)这里是一个非常简洁的代码@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中)。

答案 2 :(得分:0)

首先,谢谢迈克尔!

针对我的用例进行了一些细化,包括显示整个多行消息值。

    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选项,否则省略号将在第一行的末尾截断该消息。设置列宽没有帮助。