首页 > 解决方案 > 使用 Powershell 实时监控日志文件并在发现任何匹配项时发送消息

问题描述

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

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

问题:

  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_

标签: powershell

解决方案


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 $_
  }

笔记:

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

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


推荐阅读