使用Powershell实时监控日志文件,如果发现任何匹配则发送消息

Roo*_*oop 1 powershell

我正在使用 Powershell 监视日志文件并过滤某些关键字,需要一些帮助将以下几行放在一起并使其作为警报的自动化任务运行。

Get-Content D:\temp\wow.log -Wait | where {$_ -match "TROUBLE CONNECTING!!"}
$LastWriteTime = (Get-Item $LogFile).LastWriteTime
$CurrentTime = Get-Date
$Range = (New-TimeSpan -Start $LastWriteTime -End $CurrentTime).TotalMinutes
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 我如何使用-wait找到if 的关键词
  2. LastWriteTime从到之间的时间范围CurrentTime
  3. 然后,发送消息。

我试图将其设置为实时警报,不过滤整个日志,而仅过滤最新事件。

如果我想将其安排为任务而不输出到屏幕,我有哪些选择?

这是日志文件中的消息

WARN    server  comment 2021-06-11  02:21:01    -   -   -   -   -   2.0650160216E7  -   -   -   -   -   -   -   -   PushPublishRTMP.Reconnector[url]: TROUBLE CONNECTING!! Retrying in 60 seconds. app:live/_definst_
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 5

Get-Content -Wait无限期地运行,或者直到目标文件被删除、移动或重命名(或者以交互方式,直到按下 Ctrl-C 或关闭控制台窗口)。

它每秒轮询指定文件中的新行并将其输出到管道。

因此,您需要使用以下调用将处理作为同一管道的一部分ForEach-Object来执行:

Get-Content D:\temp\wow.log -Wait -Last 0 |
 Where-Object { $_ -match 'TROUBLE CONNECTING!!' } |
  ForEach-Object {
    # Send an email here, e.g.:
    # Send-MailMessage -SmtpServer exchange.example.com -From alerts@example.com -To jdoe@example.com -Subject 'Connection error' -Body $_
  }
Run Code Online (Sandbox Code Playgroud)

笔记:

  • -Last 0意味着文件中预先存在的内容将被忽略,并且仅输出启动命令后添加的行。我假设这可以满足您的时间窗口需求,但我不确定您的确切要求。

  • 您可以使用它Send-MailMessage来发送电子邮件,但请注意,此 cmdlet 已被视为已过时,因为它“不能保证与 SMTP 服务器的安全连接”。也就是说,如果这不是您的情况所关心的问题,那么使用它就可以了,并且考虑到 PowerShell 对向后兼容性的承诺,该 cmdlet 不太可能被删除