我正在尝试快速显示窗口事件日志中过去一天的所有事件,这些事件包含 power shell 中的某个字符串。
我找到了用于列出事件的 powershell 命令,但我基本上想对它们进行“GREP”以获取特定文本。
我需要使用 powershell,因为目标是 Windows Server 2016 Hyper-V,但我认为能够迅速地使用 powershell 在任何机器上搜索最近事件。
为了显示可用的日志,我运行:
PS C:\Users\Administrator> Get-EventLog -List
Max(K) Retain OverflowAction Entries Log
------ ------ -------------- ------- ---
20,480 0 OverwriteAsNeeded 1,113 Application
20,480 0 OverwriteAsNeeded 0 HardwareEvents
512 7 OverwriteOlder 0 Internet Explorer
20,480 0 OverwriteAsNeeded 0 Key Management Service
512 7 OverwriteOlder 1,539 Microsoft-ServerManagementExperience
20,480 0 OverwriteAsNeeded 28,667 Security
20,480 0 OverwriteAsNeeded 4,857 System
15,360 0 OverwriteAsNeeded 3,654 Windows PowerShell
在这个例子中,我的目标日志被称为应用
我可以使用以下命令将过去 24 小时的日志打印到控制台:
Get-EventLog -LogName system -after (Get-Date).AddDays(-1)
我尝试使用过滤输出Select-String
但它从未匹配任何行。
答案1
这是我最终做的事情。它搜索文本的几个事件属性的值并将其显示在控制台上:
$search = "hyper"
Get-EventLog -LogName system -after (Get-Date).AddDays(-1) | Where-Object { $_.Category.ToLower().Contains($search.ToLower()) -or $_.Message.ToLower().Contains($search.ToLower()) -or $_.Source.ToLower().Contains($search.ToLower())} | Format-Table -AutoSize -Wrap
示例输出:
Index Time EntryType Source InstanceID Message
----- ---- --------- ------ ---------- -------
4751 Aug 10 09:13 Information Microsoft-Windows... 23 NIC /DEVICE/{FD82EC81-DC0D-4655-B606-0AA9AF08E6CC} (Friendly Name: Microsoft Hyper-V Network Adapter) is now operational.
4750 Aug 10 09:13 Information Microsoft-Windows... 11 The description for Event ID '11' in Source 'Microsoft-Windows-Hyper-V-Netvsc' cannot be found. The local computer may not have the necessary registr...
4749 Aug 10 09:13 Information Microsoft-Windows... 24 NIC /DEVICE/{FD82EC81-DC0D-4655-B606-0AA9AF08E6CC} (Friendly Name: Microsoft Hyper-V Network Adapter) is no longer operational.
我是 powershell 新手,所以它可能不是最好的办法但它确实有效。我希望它能为其他人节省一些时间。
答案2
这将在特定时间段内搜索所有日志中的特定字符串。无法在事件查看器中执行此操作。某些日志需要管理员访问权限。
Get-WinEvent -ListLog * |
foreach { get-winevent @{logname=$_.logname; starttime='2:45 pm' } -ea 0 } |
where message -match 'whatever'
您不能将每个日志名直接传送到 get-winevent。 Windows API 中日志名称的限制为 256 个。这或许也解释了事件查看器中创建每个日志的视图的限制。
get-winevent -ListLog * | get-winevent # powershell 7
Get-WinEvent: Log count (445) is exceeded Windows Event Log API limit (256). Adjust filter to return less log names.
在几秒钟内在 powershell 7 中并行搜索所有日志以查找字符串:
get-winevent -listlog * |
% -parallel { get-winevent @{ logname = $_.logname } -ea 0 } | ? message -match cpu
答案3
很高兴你能利用这个机会。
注意事项。您也可以采用这种方法,以稍微简化一下...
此方法将搜索传入的所有属性以查找字符串值并返回匹配项,而无需处理大小写或单独指定每个属性的搜索字符串。
$Search = 'hyper'
(Get-EventLog -LogName system -after (Get-Date).AddDays(-1) |
Select-Object -Property Category,Index,TimeGenerated,
EntryType,Source,InstanceID,Message) -match $Search | Format-Table -AutoSize
Category Index TimeGenerated EntryType Source InstanceId Message
-------- ----- ------------- --------- ------ ---------- -------
(0) 19637 10-Aug-18 17:06:16 Information Microsoft-Windows-Hyper-V-VmSwitch 233 The operation '8' ...
(0) 19636 10-Aug-18 17:06:16 Information Microsoft-Windows-Hyper-V-VmSwitch 234 NIC D6727298-4E...
(0) 19635 10-Aug-18 17:05:39 Information Microsoft-Windows-Hyper-V-VmSwitch 233 The operation ...
(0) 19634 10-Aug-18 17:05:39 Information Microsoft-Windows-Hyper-V-VmSwitch 234 NIC 75A04E6E-1...
(1019) 19621 10-Aug-18 12:33:17 Information Microsoft-Windows-Hyper-V-VmSwitch