Windows 故障日志怎么查?用 Get-WinEvent 按时间筛选
Windows 故障排查可用 Get-WinEvent 的 FilterHashtable 在读取时限定日志和时间窗口,再核对事件来源、ID及完整消息。先明确故障发生的主机与时间,避免只看最近几条错误就判断原因。
适用环境与准备
本文面向 Windows 上的 PowerShell 7.5,依据发布时查阅的 Microsoft Learn 文档整理,未在目标机器实测。Get-WinEvent 仅支持 Windows。操作前确认账号拥有目标日志的读取权限,权限错误不能解释为没有相关事件。支持范围及权限说明见 Get-WinEvent 官方文档。
$PSVersionTable.PSVersion
Get-Date -Format o
Get-WinEvent -ListLog System |
Select-Object LogName, IsEnabled, RecordCount, LogMode, MaximumSizeInBytes依次记录终端版本、当前时间和 System 日志配置。确认故障发生在当前主机,并把工单时间转换为查询机器采用的时间基准。日志名称为示例,应用问题可能需要查询 Application 或对应应用通道。
第一步,固定故障时间窗口
$windowEnd = Get-Date
$windowStart = $windowEnd.AddMinutes(-30)
$filter = @{
LogName = 'System'
StartTime = $windowStart
EndTime = $windowEnd
}
$events = Get-WinEvent -FilterHashtable $filter -MaxEvents 100 -ErrorAction Stop
$events | Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, RecordId上例获取截至脚本运行时最近三十分钟内的最多一百条事件。StartTime、EndTime 使用 DateTime,默认从新到旧返回。先保存窗口变量,再复用查询,有助于后续对照。MaxEvents 为输出上限,结果正好达到一百条时,不应把它当作整个窗口的全部记录。
FilterHashtable 支持 LogName、ProviderName、ID、Level 与时间条件,优先在查询时过滤可减少把大量事件送入管道后再筛选的开销,参见 Microsoft 的 FilterHashtable 查询说明。事后排查时,应把示例窗口替换为已确认的故障区间。
第二步,再增加事件来源或级别
$filter.Level = 1, 2, 3
$events = Get-WinEvent -FilterHashtable $filter -MaxEvents 100 -ErrorAction Stop
$events | Format-List TimeCreated, ProviderName, Id, LevelDisplayName, RecordId, Message级别 1、2、3 分别表示严重、错误和警告。这个筛选适合缩小线索,但故障上下文也可能在信息事件中,因此应保留第一步的无级别视角。数值定义及可接受的筛选字段见 官方级别与筛选字段说明。
找到可疑来源后,用准确 ProviderName 与事件 ID 继续缩小范围。每次只增加一个条件,检查结果是否仍覆盖目标故障。事件 ID 应和来源、通道及消息一起记录,不能只凭一个编号推断所有机器上的故障。
第三步,核对消息和业务时间线
- 检查故障前后是否出现连续事件,记录时间、主机、日志名称、来源、ID 和 RecordId。
- 读取完整 Message,再与应用日志、请求记录、服务状态和变更时间比较。
- 若达到 MaxEvents 上限,缩短时间窗口或增加已确认的来源条件,再判断是否需要扩大采样范围。
- 修复后查询新的时间窗口,并验证原业务操作,保留处理前后证据。
Format-List 用于人工阅读,后续需要导出对象时应在格式化前处理 $events。消息中可能包含账号、文件路径或内部地址,分享时应按实际需要脱敏。
常见问题与边界
提示找不到匹配事件,能证明没有发生故障吗?
只能说明当前查询未匹配。检查日志通道、时间基准、筛选条件和保留范围,再逐步放宽条件。访问拒绝、日志不存在等错误需要单独处理,示例使用 -ErrorAction Stop 使读取错误明确暴露。
手里只有保存的 evtx 文件怎么办?
Get-WinEvent 可以读取保存的事件日志文件。示例路径需替换为实际文件,核对文件来源与覆盖时间,并使用适当权限读取。参数定义见 官方 Path 参数说明。
Get-WinEvent -Path 'D:\Evidence\System.evtx' -MaxEvents 50 |
Format-List TimeCreated, ProviderName, Id, RecordId, Message需要在传递已导出的证据文件前后核对内容一致性时,可参考本站 PowerShell 用 Get-FileHash 比较 SHA256。哈希匹配不能单独证明日志完整或来源可信。本文没有执行目标主机诊断,也未提供虚构事件或实测效果数据。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭