@extends('layouts.app') @section('title', 'Log 分析 — ' . $logCollection->displayName()) @section('content')
{{-- 麵包屑 --}} {{-- 頁首資訊列 --}}
{{ $logCollection->typeLabel() }} {{ $logCollection->displayName() }}
主機:{{ $logCollection->host?->name ?? $logCollection->hostname ?? $logCollection->source_ip ?? '未知' }}  ·  來源:{{ $logCollection->receive_method === 'rsyslog' ? 'rsyslog' : ($logCollection->receive_method === 'http_upload' ? 'API 上傳' : '手動上傳') }}  ·  {{ number_format($logCollection->file_size / 1024, 1) }} KB  ·  {{ number_format($logCollection->line_count) }} 行  ·  {{ $logCollection->created_at->format('Y-m-d H:i') }}
{{ number_format($logCollection->error_count) }}
Error
{{ number_format($logCollection->warning_count) }}
Warning
{{ number_format(($logCollection->line_count ?? 0) - $logCollection->error_count - $logCollection->warning_count) }}
其他
@csrf
@csrf @method('DELETE')
{{-- 嚴重度快篩 --}}
全部 ({{ number_format($logCollection->line_count) }}) @php $sevOrder = ['emergency','alert','critical','error','warning','notice','info','debug','unknown']; $sevColor = \App\Models\LogEntry::$SEVERITY_COLOR; $sevLabel = ['emergency'=>'Emergency','alert'=>'Alert','critical'=>'Critical','error'=>'Error','warning'=>'Warning','notice'=>'Notice','info'=>'Info','debug'=>'Debug','unknown'=>'Unknown']; @endphp @foreach($sevOrder as $sv) @if(isset($severityCounts[$sv]) && $severityCounts[$sv] > 0) {{ $sevLabel[$sv] }} ({{ number_format($severityCounts[$sv]) }}) @endif @endforeach {{-- 搜尋 --}}
@if($search) 清除 @endif
{{-- Log 內容表格 --}}
@forelse($entries as $entry) @empty @endforelse
時間 嚴重度 程序 訊息
{{ $entry->logged_at?->format('m/d H:i:s') ?? '—' }} {{ strtoupper($entry->severity) }} {{ $entry->process ?? '—' }}{{ $entry->pid ? '['.$entry->pid.']' : '' }} {{ $entry->message }}
@if($severity || $search) 找不到符合條件的記錄 @else 尚無解析的 Log 項目 @endif
@if($entries->hasPages()) @endif
{{-- ── 分析報告 ─────────────────────────────────────────────────── --}} @if($reportErrors->isNotEmpty() || $reportProcesses->isNotEmpty())
此 Log 分析報告
— {{ $logCollection->created_at->format('Y-m-d H:i') }} 收到,{{ number_format($logCollection->line_count) }} 行
{{-- 重複錯誤事件 --}} @if($reportErrors->isNotEmpty())
重複出現的錯誤事件 {{ $reportErrors->count() }} 種 出現 ≥ 2 次的 Error / Critical
@php $solutions = [ 'Failed password' => ['SSH 暴力破解', '啟用 fail2ban 封鎖惡意 IP'], 'Invalid user' => ['SSH 非法帳號', '確認是否有弱帳號,考慮 AllowUsers'], 'Connection refused' => ['服務無回應', '確認目標服務是否正常啟動'], 'permission denied' => ['權限不足', '檢查 owner / chmod 設定'], 'disk quota' => ['磁碟配額超出', '清理舊 log 或擴充空間'], 'out of memory' => ['記憶體不足', '增加 swap 或調整記憶體限制'], 'no space left' => ['磁碟已滿', '立即清理 /tmp 或日誌目錄'], 'segfault' => ['程序崩潰 (SIGSEGV)', '查 core dump,更新程式版本'], 'certificate' => ['SSL 憑證問題', '更新或重新申請 TLS 憑證'], 'ssl' => ['SSL 錯誤', '確認憑證鏈完整,檢查到期日'], 'timeout' => ['連線逾時', '確認網路延遲或增加 timeout 設定'], 'authentication failure' => ['驗證失敗', '確認密碼 / 金鑰是否正確'], 'CRON' => ['Cron 執行失敗', '查 cron job 腳本的錯誤輸出'], 'kernel' => ['Kernel 警告', '執行 dmesg 並確認硬體狀況'], 'mysql' => ['資料庫錯誤', '查 MySQL slow query / error log'], 'OOM' => ['OOM Killer 觸發', '程序被系統強制終止,增加記憶體'], 'oom' => ['OOM Killer 觸發', '程序被系統強制終止,增加記憶體'], 'unable to stat' => ['檔案不存在', '確認對應路徑檔案是否存在'], 'script not found' => ['Script 遺失', '確認 PHP 腳本路徑正確'], ]; $getSol = function(string $msg) use ($solutions) { $lower = strtolower($msg); foreach ($solutions as $kw => [$lbl, $tip]) { if (str_contains($lower, strtolower($kw))) return compact('lbl','tip'); } return null; }; @endphp @foreach($reportErrors as $err) @php $sol = $getSol($err->message); @endphp @endforeach
次數 嚴重度 錯誤訊息 建議處置
{{ number_format($err->cnt) }} @php $sc = match($err->severity) { 'critical','alert','emergency' => 'dark', default => 'danger', }; @endphp {{ strtoupper($err->severity) }} {{ Str::limit($err->message, 120) }} @if($sol) {{ $sol['lbl'] }} {{ $sol['tip'] }} @else @endif
@endif {{-- 有錯誤的程序排行 --}} @if($reportProcesses->isNotEmpty())
程序錯誤排行
@foreach($reportProcesses as $proc) @endforeach
程序名稱 Error 總行數
{{ $proc->process }} {{ number_format($proc->errs) }} {{ number_format($proc->cnt) }}
@endif
{{-- /row --}}
{{-- /report --}} @elseif($logCollection->status === 'done' && $logCollection->error_count === 0)
此 Log 分析完成,未發現任何 Error 或 Critical 事件。
@endif
@endsection