You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerShell监控滚动日志,每5分钟未检测到指定字符串则告警

日志监控告警脚本(进程宕机检测)

需求适配说明

你需要的是当日志中未出现指定的“存活标记”字符串时触发告警(提示进程宕机),同时要处理日志文件达到10MB时自动轮转(文件名保持不变,原文件被归档/替换)的情况。以下是适配需求的PowerShell脚本,操作简单,注释清晰,适合非专业用户使用。

完整脚本

# -------------------------- 配置参数(请根据实际情况修改) --------------------------
$logPath = "D:\temp\wow.log"       # 日志文件路径
$keepAliveString = "PROCESS HEALTHY" # 进程正常运行时会输出的标记字符串(请替换为你的实际字符串)
$checkIntervalMinutes = 5         # 检查间隔(分钟)
# 邮件告警配置
$smtpServer = "exchange.example.com"
$fromAddress = "alerts@example.com"
$toAddress = "jdoe@example.com"
$alertSubject = "告警:进程可能已宕机"
# -----------------------------------------------------------------------------------

# 循环执行检查
while ($true) {
    Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 开始检查日志..."

    # 获取当前日志文件的最后修改时间,计算5分钟前的时间点(只检查最近5分钟的日志)
    $checkStartTime = (Get-Date).AddMinutes(-$checkIntervalMinutes)

    # 读取日志文件的所有行,筛选出最近5分钟内的日志条目
    # 处理日志轮转:如果主日志文件的最后修改时间早于检查起始时间,可能存在轮转后的归档文件
    # 这里假设轮转文件命名为 wow.log.1(可根据实际归档规则调整)
    $logEntries = @()
    if (Test-Path $logPath) {
        $logEntries += Get-Content $logPath | Where-Object {
            # 尝试解析日志中的时间戳(如果日志有时间戳的话,请替换为你的日志时间格式)
            # 示例日志格式:2024-05-20 14:30:00 [INFO] PROCESS HEALTHY
            if ($_ -match '(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})') {
                $logTime = [DateTime]::Parse($matches[1])
                $logTime -ge $checkStartTime
            } else {
                # 如果日志没有时间戳,默认保留所有行(或根据实际情况调整)
                $true
            }
        }
    }

    # 检查是否存在轮转后的归档文件(比如wow.log.1),并读取其最近5分钟的内容
    $rotatedLogPath = "$logPath.1"
    if (Test-Path $rotatedLogPath) {
        $logEntries += Get-Content $rotatedLogPath | Where-Object {
            if ($_ -match '(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})') {
                $logTime = [DateTime]::Parse($matches[1])
                $logTime -ge $checkStartTime
            } else {
                $true
            }
        }
    }

    # 判断是否检测到存活标记字符串
    $hasKeepAlive = $logEntries -match $keepAliveString

    if (-not $hasKeepAlive) {
        Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 未检测到存活标记,触发告警!"
        # 发送告警邮件
        $alertBody = @"
告警时间:$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')
问题描述:最近$checkIntervalMinutes分钟内,日志文件中未检测到存活标记字符串「$keepAliveString」,进程可能已宕机。
日志路径:$logPath
"@
        Send-MailMessage -SmtpServer $smtpServer -From $fromAddress -To $toAddress -Subject $alertSubject -Body $alertBody
    } else {
        Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 检测到存活标记,进程运行正常。"
    }

    # 等待指定间隔后再次检查
    Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 等待$checkIntervalMinutes分钟后再次检查..."
    Start-Sleep -Seconds ($checkIntervalMinutes * 60)
}

使用说明

  1. 修改配置参数:将脚本开头的$logPath、$keepAliveString、邮件配置等信息替换为你实际的内容。
  2. 日志时间戳适配:如果你的日志包含时间戳,请确保脚本中解析时间戳的正则表达式((\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}))与你的日志格式匹配;如果日志没有时间戳,可以删除时间筛选的逻辑,直接检查所有日志内容。
  3. 日志轮转适配:如果你的日志轮转规则不是生成wow.log.1,请修改$rotatedLogPath的命名规则。
  4. 运行脚本:打开PowerShell,导航到脚本所在目录,执行.\你的脚本名.ps1即可。

与原代码的区别

原代码是检测到指定错误字符串时告警,而本脚本是未检测到存活标记字符串时告警,更适合进程宕机的场景;同时增加了定时检查逻辑和日志轮转处理,适配你的特殊需求。

内容的提问来源于stack exchange,提问作者BA Hartness

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:33:11