我编写了一个基本脚本,它从restful api获取系统日志,并将其写入json文件。它工作,但我看到巨大的RAM问题 - 我认为它是因为脚本获取系统日志条目的整个有效负载并将其存储在内存中,然后将其写入文件。
下面脚本中的do循环用于分页 - api一次只返回一定数量的事件,因此需要迭代。
可以在这里改进性能 - 我猜可以将内存中的有效负载在达到一定大小时写入文件,然后它只是循环过来?或者还有什么其他方法可以减少系统资源吗?
感谢您的帮助!
#Name: getLogs.ps1
#Purpose: Script for exporting logs to a json file
#variables
$org = "<api url here>"
$token="<api token here>"
$filePath = "D:\Downloads\logs\test2.json"
#format the date and append 00:00:00
$fromTime = Get-Date -Format s
$fromTime = $fromTime.Substring(0,10) + "00%3A00%3A00Z"
#format the date and append 23:59.59
$toTime = Get-Date -Format s
$toTime = $fromTime.Substring(0,10) + "T23%3A59%3A59Z"
### Set $uri as the API URI for use in the loop
$uri = "$org/api/v1/logs?until=$toTime&limit=20&sortOrder=DESCENDING&q=&since=$fromTimeT00"
### Define $allLogsas empty array
$allLogs = @()
### Use a while loop and get all users from Okta API
DO
{
$webrequest = Invoke-WebRequest -Headers @{"Authorization" = "SSWS $token"} -Method Get -Uri $uri
$link = $webrequest.Headers.Link.Split("<").Split(">")
$uri = $link[3]
$json = $webrequest | ConvertFrom-Json
$allLogs += $json
#slow it down to avoid rate limits
Start-Sleep -m 1001
} while ($webrequest.Headers.Link.EndsWith('rel="next"'))
# get results, switch to json, save
$allLogs | ConvertTo-Json | Out-File $filePath
答案 0 :(得分:1)
您可以尝试更改:
$json = $webrequest | ConvertFrom-Json
要:
$webrequest | Out-File $filePath -Append
然后完全取消$alllogs
。
答案 1 :(得分:1)
还有另一篇关于性能和使用PoSH Invoke- * cmdlet的帖子。 如前一篇文章所述,PoSHv6之前的速度通常很慢。 有关该主题的信息,请参阅此帖子。 Choppy File Download using Powershell on Azure VM