首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Windows服务的Powershell脚本实时监控

基于Windows服务的Powershell脚本实时监控
EN

Code Review用户
提问于 2023-03-03 18:27:46
回答 1查看 26关注 0票数 0

我在用脚本来监控文件。当检测到一个模式时,它会发送一封电子邮件通知某人。

我正在通过NSSM创建一个Windows服务。

我的问题是:如何提高我的脚本的性能?白天我必须监视一个大的日志文件。一个滚动日志文件(log1.log,然后log2.log,然后log3.log等)的主日志文件是log.log。日志文件旋转之间的时间(以秒为单位)。旋转时间约为2-3秒.日志文件大小约为20-30MB。

剧本:

代码语言:javascript
复制
while( $true ) {

Start-Transcript -path c:\temp\monitor_file.log

$fromaddress = "filemon@contoso.com"
$emailto = "IT@contoso.com"
$SMTPSERVER = "xx.xx.xx.xx"

$File = "C:\temp\log.log"
Get-Content $File -Wait -Last 0 | Select-string  'Finished.' | ForEach {
    Send-mailmessage -from $fromaddress -to $emailto -subject "Log changed" -smtpServer $SMTPSERVER -Encoding UTF8 -Priority High
}

}
EN

回答 1

Code Review用户

发布于 2023-03-27 21:29:50

首先,每2-3秒对一个20-30MB文件进行Get-Content是非常耗费资源的,如果文件每分钟只更改几次的话,这是非常浪费的。我会遵循@anto418 S的建议,并使用FilesystemWatcher

还可以在FilesystemWatcher的S事件处理程序中进行优化,以防止它读取不必要的数据。如果您已经多次读取该文件,则不希望从头开始。

  • 一种选择是设置指向您最后读到的位置的指针,并在发生更改时从该位置开始读取。Filestream.Read允许您从文件中的偏移量开始。
  • 如果“终结”行始终是编写的最后几行之一,您可以使用-Tail参数对获取内容进行进一步优化:Get-Content $File -Tail 2 --这可能是您使用-last 0参数的意图,但似乎不支持-last

我听说-Wait参数可以锁定一个文件,因此您错过了更改或干扰了对它的写入。这是值得测试的,这实际上是可行的,或删除该参数。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/283707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档