PowerShell拆分日期范围为4段并行获取Windows应用日志是否可行?
问题:将日期范围拆分为4个均等子范围的方式是否足够?
详细背景
我一直在研究如何通过PowerShell脚本提升Windows应用日志的获取速度,目前的思路是把日期范围拆分成4个部分,并行执行请求。
当前拆分逻辑代码
目前这段拆分日期范围的代码似乎可行,求其他思路或意见:
# 示例时间范围 $StartDate = (get-date).Addminutes(-10000) $EndDate = (get-date) # 计算1/4时间段的分钟数 $Mins = (($EndDate - $StartDate).TotalMinutes /4) $Start = $null $End = $null for ($i = 1; $i -le 4; $i++) { if (!$Start) { $Start = $startDate $End = $StartDate.AddMinutes($Mins) } Else { $Start = $End.AddSeconds(1) $End = $End.AddMinutes($Mins) } Write-Host($Start) Write-Host($End) ' ' }
代码输出结果
3/2/2023 8:29:53 PM 3/4/2023 2:09:53 PM 3/4/2023 2:09:54 PM 3/6/2023 7:49:53 AM 3/6/2023 7:49:54 AM 3/8/2023 1:29:53 AM 3/8/2023 1:29:54 AM 3/9/2023 7:09:53 PM
更新尝试:使用EventLogReader读取日志
经讨论后,我尝试用PowerShell的EventLogReader读取日志,目前脚本可运行但需要梳理返回结果:
using namespace System.Diagnostics.Eventing.Reader $Log = $null $Computer = $env:COMPUTERNAME try { # 时间过滤器 $start = [datetime]::UtcNow.AddHours(-1).ToString('o') $end = [datetime]::UtcNow.ToString('o') $filter = "*[System[TimeCreated[@SystemTime >= '{0}']]] and *[System[TimeCreated[@SystemTime <= '{1}']]]" -f $start, $end # 创建查询 $query = [EventLogQuery]::new('Application', [PathType]::LogName, $filter) $query.Session = [EventLogSession]::new($Computer) # 读取日志 $reader = [EventLogReader]::new($query) while($log = $reader.ReadEvent()) { $log } } finally { if ($reader) { $reader.Dispose() } }
性能优化相关说明
- 最快日志读取方式:经建议,上述EventLogReader方法适合获取大量日志数据;
Get-WinEvent搭配过滤器适合获取少量特定日志;建议避免使用Get-EventLog。 - 进一步性能优化:除上述代码外,可使用
Start-Job进一步提速——将需要在各服务器执行的函数放入队列,用Start-Job并发调用,注意控制作业数量不超过服务器核心数,维持最大有效并发量。
内容的提问来源于stack exchange,提问作者Mike Q
相关产品推荐
相关产品推荐

