我本地有一台服务器的 .evtx 格式的事件日志。我可以使用以下命令将日志文件加载到 PS 中:
Get-WinEvent -路径 D:\Desktop\serverlogs.evtx
我想做的是在消息字段组事件中,文本匹配一定百分比(例如 80% 相同)。因为我们有错误堆栈跟踪,详细信息将是相同的,但我们还会记录客户端的 IP、访问的 URL,这可能会有所不同。
我想对它们进行分组,这样我就可以找出最常见的错误并优先修复它们,而且由于日志文件中有 25,000 多个错误,所以我不想手动执行此操作。
我想我可以弄清楚如何完成大部分工作,但不确定如何完成“对大部分相同的字段进行分组”部分,powershell 是否内置了类似的东西?
答案1
首先,您需要过滤掉尽可能多的内容,因为下一步要用到 cmdlet Where-Object
,而对于这种事情来说,它可能会很慢(不幸的是,它看起来不像是支持Get-WinEvent
事件的消息属性通配符的任何参数)。
例如,仅获取“错误”级别的事件:
$events = Get-WinEvent -FilterHashTable @{ Path="D:\Desktop\serverlogs.evtx";Level=2 }
然后,您可以使用-match
或-like
进一步筛选出具有相似文本的内容:
$events = $events | ?{ $_.Message -match "your similar error here" }
现在您已经缩小了列表范围,您可以将结果传送到 cmdlet Group-Object
,指定您想要根据事件的“消息”属性对它们进行分组:
$events | Group-Object -Property Message
答案2
虽然你问的是如何在 Powershell 中执行此操作,但我建议你也看一下Microsoft 日志分析器这将使您能够针对日志编写类似 SQL 的查询(以及一大堆其他有用的技巧)。您也没有理由不能从 Powershell 中驱动它。