You need to enable JavaScript to run this app. 如何通过PowerShell实现Windows服务日志错误实时监控及邮件告警
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 05:15:04