如何通过PowerShell实现Windows服务日志错误实时监控及邮件告警
Windows服务日志实时监控PowerShell实现方案
功能覆盖说明
- 无需安装任何第三方工具,完全使用PowerShell原生能力实现
- 自动识别
日_月_年.txt格式命名的最新日志文件 - 实时监控日志内容,匹配Error、Exception等自定义关键词
- 命中关键词后自动发送邮件告警
- 支持后台静默运行、开机自启
完整可运行脚本
# -------------------------- 自定义配置项 -------------------------- # 服务日志存放目录 $logRootPath = "C:\xxx\ServiceLogs" # 监控关键词(不区分大小写) $monitorKeywords = @("Error", "Exception", "FATAL", "执行失败") # 邮件服务配置 $smtpServer = "smtp.你的邮箱服务商.com" $smtpPort = 587 $smtpAccount = "alarm@yourdomain.com" # 注意:第三方邮箱(QQ/163等)需填写SMTP授权码,不是账号登录密码 $smtpPassword = ConvertTo-SecureString "你的SMTP授权码" -AsPlainText -Force $smtpCredential = New-Object System.Management.Automation.PSCredential($smtpAccount, $smtpPassword) $mailSender = $smtpAccount # 支持多个收件人,用逗号分隔 $mailReceivers = @("admin@yourdomain.com", "ops@yourdomain.com") $mailTitle = "【服务告警】日志检测到异常内容" # ------------------------------------------------------------------- # 自动获取最新日志文件 function Get-TargetLogFile { $allLogFiles = Get-ChildItem -Path $logRootPath -Filter "*_*_*.txt" | Where-Object { !$_.PSIsContainer } if ($allLogFiles.Count -eq 0) { Write-Error "指定目录下未找到符合命名规则的日志文件" exit 1 } # 优先按文件名解析日期排序取最新 $dateParsedLogs = @() foreach ($file in $allLogFiles) { $nameSegments = $file.BaseName.Split("_") if ($nameSegments.Count -eq 3) { try { $logDate = [DateTime]::ParseExact("$($nameSegments[0])/$($nameSegments[1])/$($nameSegments[2])", "dd/MM/yyyy", $null) $dateParsedLogs += [PSCustomObject]@{ FileObject = $file LogDate = $logDate } } catch {} } } if ($dateParsedLogs.Count -gt 0) { return ($dateParsedLogs | Sort-Object LogDate -Descending | Select-Object -First 1).FileObject } else { # 文件名解析失败时,按文件创建时间兜底取最新 return $allLogFiles | Sort-Object CreationTime -Descending | Select-Object -First 1 } } $targetLog = Get-TargetLogFile Write-Host "已锁定最新日志文件:$($targetLog.FullName)" # 实时监控+关键词匹配+邮件告警 Get-Content -Path $targetLog.FullName -Wait -Encoding UTF8 | ForEach-Object { $currentLine = $_ foreach ($kw in $monitorKeywords) { if ($currentLine -match [regex]::Escape($kw)) { $mailContent = @" 告警触发时间:$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") 对应日志文件:$($targetLog.FullName) 异常内容片段:$currentLine "@ Send-MailMessage -From $mailSender -To $mailReceivers -Subject $mailTitle -Body $mailContent -SmtpServer $smtpServer -Port $smtpPort -UseSsl -Credential $smtpCredential -Encoding UTF8 Write-Host "检测到异常,已发送告警邮件:$currentLine" break } } }
后台运行配置
- 临时后台运行:打开PowerShell执行命令
Start-Job -ScriptBlock { & "C:\你的脚本存放路径\LogMonitor.ps1" }即可 - 开机自启配置:
- 打开Windows任务计划程序,创建新任务
- 触发器选择「系统启动时」
- 操作选择「启动程序」,程序路径填
powershell.exe,参数填-ExecutionPolicy Bypass -File "C:\你的脚本存放路径\LogMonitor.ps1" - 安全选项勾选「不管用户是否登录都要运行」,保存即可
补充说明
- 如果需要监控多个服务的日志,可复制多份脚本修改对应日志目录和告警配置即可
- 如需支持跨天自动切换新生成的日志,可在脚本中增加定时检测逻辑,每小时调用一次
Get-TargetLogFile判断是否有更新的日志,有就重新挂载监控 - 如遇邮件发送失败,优先检查SMTP端口、授权码是否正确,以及服务器是否允许访问SMTP服务器的对应端口
内容的提问来源于stack exchange,提问作者Maverick
相关产品推荐
相关产品推荐

