powershell - 使用 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
问题:
- 如何使用
-wait
找到if
的关键词 - 从
LastWriteTime
到的时间范围之间CurrentTime
- 然后,发送消息。
我正在尝试将其作为实时警报,而不是过滤整个日志,而只过滤最新事件。
如果我想将其安排为不输出到屏幕的任务,我有哪些选择?
这是日志文件中的消息
WARN server comment 2021-06-11 02:21:01 - - - - - 2.0650160216E7 - - - - - - - - PushPublishRTMP.Reconnector[url]: TROUBLE CONNECTING!! Retrying in 60 seconds. app:live/_definst_
解决方案
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 不太可能被删除。
推荐阅读
- ruby-on-rails - 即使在控制器中调用方法,模型也无法接收来自方法的调用
- regex - 关于交替的 (a|b)* 示例,我很困惑,为什么结果集中有 ab、ba?
- razor - 如何在@Html.DropDownList等html辅助控件中使用[(ngModel)]
- java - 如何断言 SpringFramework 的 org.springframework.http.ResponseEntity 类设置的“Content-Type”?
- angular - 使用角度创建视图结构
- javascript - 反应聊天应用程序“无法读取 null 的属性‘键’”?
- android - 日期比较显示错误 java.lang.IllegalArgumentException: Cannot format given Object as a Date
- google-kubernetes-engine - 一旦我们使用 HELM 安装,Kubernetes-Dashboard Pod 就无法工作
- php - 如何使用 mysqli_fetch_assoc 从数据库中获取数据?
- android - 在activity中访问BroadcastReceiver方法onReceive()