我的脚本会在24小时内报告应用程序,系统和安全日志中的事件错误。该脚本平均需要8分钟才能运行。我相信这些特定的陈述会导致这个问题:
$Lap = Get-EventLog -computername $server -LogName $logname -after (Get-Date).AddHours(-24)
$Lap | where {$_.entryType -match "Error"} | Sort-Object eventid |
group-object eventid | Format-Table Name, Count -auto | fl |
out-string | Add-Content $eventlogfile
如果我将-after
参数替换为-newest
,则脚本会快速运行。有什么想法为什么上述陈述有助于脚本运行一段时间?
修改的 做了一些研究,我了解到通过使用get-eventlog cmdlet,PS会解析整个事件日志。
衡量确定过去24小时内发现的应用程序错误数量需要多长时间
Measure-Command -Expression {get-eventlog -ComputerName server123 -LogName Application -EntryType Error -after (Get-Date).AddHours(-24)}
总时间:54秒
计算过去24小时内弹出的应用程序错误数*
$logs1 = get-eventlog -ComputerName server123 -LogName Application -EntryType Error -after (Get-Date).AddHours(-24)
$logs1.count
有3个错误
measure-command -expression {get-eventlog -ComputerName server123 -logname application -Newest 3 }
43毫秒
为什么使用-after
cmdlet指定get-eventlog
参数的任何想法都会返回比指定-newest
参数更长的结果?
答案 0 :(得分:3)
您通过网络传输过去24小时内的所有事件,然后在本地计算机上过滤它们:
$Lap = Get-EventLog -computername $server -LogName $logname -after (Get-Date).AddHours(-24)
$Lap | where {$_.entryType -match "Error"} | Sort-Object eventid | ...
直接使用Get-EventLog
进行过滤可以加快速度,因为只有过去24小时的错误事件才能通过网络传输:
$Lap = Get-EventLog -Computer $server -LogName $logname -EntryType 'Error' -After (Get-Date).AddHours(-24)
$Lap | Sort-Object eventid | ...
答案 1 :(得分:2)
cmdlet Measure-Command
可用于查找命令需要多长时间。用它来了解发生了什么。将脚本拆分一下以找到最昂贵的操作。像这样的东西,
Measure-Command -Expression { $Lap = Get-EventLog -computername $server -LogName $logname -after (Get-Date).AddHours(-24) }
Measure-Command -Expression { $lap2 = $Lap| ? {$_.entryType -match "Error"}}
Measure-Command -Expression { $Lap3 = $Lap2 |Sort-Object eventid
# Keep splitting / unsplitting statements until you find the costly one
Measure-Command -Expression { $Lap3 |group-object eventid|Format-Table Name, Count -auto|fl|out-string|Add-Content $eventlogfile }
答案 2 :(得分:1)
我以前见过这个,并且使用-After大型日志文件肯定是一个性能问题。
我在使用重复日志读取时使用了索引号来加快速度:
$last_index = get-content index_history.txt
#Get the index number of the last log entry
$index = (Get-EventLog -ComputerName $_ -LogName $log -newest 1).index
#calculate number of events to retrieve
if ($last_index){$n = $index - $last_index}
#get the log entries
$Lap = Get-EventLog -computername $server -LogName $logname -Newest $n
$index | set-content index_history.txt