# 日志分析脚本 - 检测僵尸任务 Write-Host "正在分析日志文件...`n" -ForegroundColor Cyan $logFile = "message-dispatcher_debug.txt" if (-not (Test-Path $logFile)) { Write-Host "错误: 找不到日志文件 $logFile" -ForegroundColor Red exit 1 } $lines = Get-Content $logFile $tasks = @{} $completedTasks = @{} $failedTasks = @{} $instanceLocks = @{} for ($i = 0; $i -lt $lines.Count; $i++) { $line = $lines[$i].Trim() if (-not $line) { continue } # 匹配任务ID if ($line -match "任务(直接分配|调度|确认|完成|失败|超时): ([a-f0-9-]{36})") { $taskId = $matches[2] $eventType = $matches[1] if (-not $tasks.ContainsKey($taskId)) { $tasks[$taskId] = @{ taskId = $taskId events = @() startTime = $null endTime = $null instanceId = $null completed = $false failed = $false } } $tasks[$taskId].events += @{ line = $i + 1 content = $line } if ($line -match "任务完成") { $tasks[$taskId].completed = $true $tasks[$taskId].endTime = $line $completedTasks[$taskId] = $true } elseif ($line -match "任务失败" -or $line -match "任务超时") { $tasks[$taskId].failed = $true $tasks[$taskId].endTime = $line $failedTasks[$taskId] = $true } elseif ($line -match "任务调度" -or $line -match "任务直接分配") { if ($line -match "实例 ([^,\s]+)") { $tasks[$taskId].instanceId = $matches[1] } $tasks[$taskId].startTime = $line } } # 匹配实例锁定 if ($line -match "实例已锁定: ([^,]+), taskId: ([a-f0-9-]{36})") { $instanceId = $matches[1] $taskId = $matches[2] $instanceLocks[$instanceId] = @{ locked = $true taskId = $taskId line = $i + 1 } if ($tasks.ContainsKey($taskId)) { $tasks[$taskId].instanceId = $instanceId } } # 匹配实例释放 if ($line -match "实例锁已释放: ([^,\s]+)") { $instanceId = $matches[1] $instanceLocks[$instanceId] = @{ locked = $false line = $i + 1 } } } # 统计 $activeTasks = @() $zombieTasks = @() foreach ($task in $tasks.Values) { if (-not $task.completed -and -not $task.failed) { $activeTasks += $task if ($task.startTime) { $zombieTasks += $task } } } $lockedInstances = @() foreach ($instanceId in $instanceLocks.Keys) { if ($instanceLocks[$instanceId].locked) { $lockedInstances += @{ instanceId = $instanceId info = $instanceLocks[$instanceId] } } } # 输出结果 Write-Host "=== 统计结果 ===" -ForegroundColor Yellow Write-Host "总任务数: $($tasks.Count)" Write-Host "已完成任务: $($completedTasks.Count)" Write-Host "失败/超时任务: $($failedTasks.Count)" Write-Host "活跃任务(未完成): $($activeTasks.Count)" Write-Host "可能的僵尸任务(已开始但未完成): $($zombieTasks.Count)`n" if ($zombieTasks.Count -gt 0) { Write-Host "=== 可能的僵尸任务详情 ===" -ForegroundColor Red foreach ($task in $zombieTasks) { Write-Host "任务ID: $($task.taskId)" -ForegroundColor Red $instanceDisplay = if ($task.instanceId) { $task.instanceId } else { '未知' } Write-Host "实例ID: $instanceDisplay" Write-Host "事件记录:" $recentEvents = $task.events | Select-Object -Last 5 foreach ($evt in $recentEvents) { Write-Host " 行$($evt.line): $($evt.content)" } Write-Host "" } } else { Write-Host "✅ 没有发现僵尸任务!" -ForegroundColor Green } if ($lockedInstances.Count -gt 0) { Write-Host "`n=== 仍被锁定的实例 ===" -ForegroundColor Red foreach ($item in $lockedInstances) { Write-Host "实例: $($item.instanceId)" -ForegroundColor Red Write-Host "任务ID: $($item.info.taskId)" Write-Host "锁定位置: 行$($item.info.line)" Write-Host "" } } else { Write-Host "`n✅ 所有实例锁都已释放!" -ForegroundColor Green }