使用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) }
使用说明
- 修改配置参数:将脚本开头的
$logPath、$keepAliveString、邮件配置等信息替换为你实际的内容。 - 日志时间戳适配:如果你的日志包含时间戳,请确保脚本中解析时间戳的正则表达式(
(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}))与你的日志格式匹配;如果日志没有时间戳,可以删除时间筛选的逻辑,直接检查所有日志内容。 - 日志轮转适配:如果你的日志轮转规则不是生成
wow.log.1,请修改$rotatedLogPath的命名规则。 - 运行脚本:打开PowerShell,导航到脚本所在目录,执行
.\你的脚本名.ps1即可。
与原代码的区别
原代码是检测到指定错误字符串时告警,而本脚本是未检测到存活标记字符串时告警,更适合进程宕机的场景;同时增加了定时检查逻辑和日志轮转处理,适配你的特殊需求。
内容的提问来源于stack exchange,提问作者BA Hartness
相关产品推荐
相关产品推荐

