146 lines
4.3 KiB
PowerShell
146 lines
4.3 KiB
PowerShell
|
|
# 日志分析脚本 - 检测僵尸任务
|
|
|
|
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
|
|
}
|