~/blog/laravel-scheduler-llm-log-analysis-automation-2026.md
Laravel 與後端開發 · 2026 / 03 / 12 · 3 views

每天幾百條錯誤通知有救嗎?Laravel Scheduler 結合 LLM 自動摘要日誌實戰

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
每天幾百條錯誤通知有救嗎?Laravel Scheduler 結合 LLM 自動摘要日誌實戰
目錄 table-of-contents.md

早上打開 Slack,幾百條 Error Log 通知瀑布般刷下來,點開一看,九成都是同一個資料庫 Deadlock 或第三方 API Timeout 引發的連鎖反應。與其練就一目十行的掃 Log 神功,不如讓 Laravel Scheduler 每天定時把日誌餵給 LLM,自動摘要、分類並分析根因。本文示範這條自動化管線的完整實作,把告警海濃縮成一份能直接行動的每日摘要。

現在已經是 2026 年了,AIOps(人工智慧 IT 營運)和 Agentic Workflow 已經成為企業標配,難道我們還要像十年前一樣,用肉眼一行一行去比對 laravel.log 嗎?

今天這篇文章,我要帶大家實作一套現代化的運維解法:將 Laravel 任務排程 (Scheduler) 結合 LLM:自動摘要、分類並分析每日系統錯誤日誌。我們會讓 Laravel 在每天早上你進辦公室前,自動把昨天的海量 Log 清洗、去重,然後丟給 LLM(大型語言模型)進行深度分析,最後在 Slack 吐出一份「說人話」的運維早報。

為什麼傳統的 Log 監控在 2026 年已經不夠用?

在過去,我們通常會依賴 Sentry、Flare 或是 ELK Stack 來收集日誌。這些工具很棒,但它們解決的是「收集」與「告警」的問題,而不是「分析」與「洞察」。

  • 警報疲勞 (Alert Fatigue): 當同一個 API 發生 500 次 502 Bad Gateway,你的手機會震動 500 次,最後你只會選擇把它靜音。
  • 缺乏上下文: Sentry 可以告訴你哪一行出錯,但無法告訴你:「這可能與昨天剛部署的新版資料庫遷移有關」。
  • 無法分辦輕重緩急: 到底是前端發送了錯誤的 Payload,還是核心支付模組掛了?工程師往往需要點進去仔細看才能判斷。

導入 LLM 後,我們可以讓 AI 扮演「初階運維工程師」的角色,幫我們把雜亂的日誌變成結構化的行動指南 (Actionable Insights)。

架構設計:Laravel Scheduler x LLM 分析管線

這套系統的底層邏輯(Pillar)其實非常清晰,我們可以用 Laravel 強大的排程器來驅動整個管線,整個 Cluster 包含三個核心步驟:

  1. 資料萃取與清洗 (Data Extraction & Sanitization): 讀取前一天的 laravel.log,透過正則表達式萃取出 Error 等級以上的日誌,並進行去重與 PII (機敏資料) 脫敏。
  2. 提示詞工程與 LLM 分析 (Prompt Engineering & LLM Analysis): 將壓縮後的日誌特徵轉化為結構化 Prompt,呼叫 OpenAI (GPT-4o) 或 Anthropic (Claude 3.5) 的 API。
  3. 任務排程與通知 (Scheduler & Notification): 透過 Laravel Console Command 封裝邏輯,並掛載到 Console Kernel 中,每天早上 8:30 準時將分析報告推送到 Slack 或 Teams。

步驟一:萃取與清洗日誌資料

如果直接把整個 laravel.log 丟給 LLM,除了會引發嚴重的 Token 費用超標,還可能洩漏使用者的個資。因此,我們必須先在本地進行「聚合」(Aggregation)。


// app/Console/Commands/AnalyzeDailyLogs.php
namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;

class AnalyzeDailyLogs extends Command
{
    protected $signature = 'logs:analyze-daily';
    protected $description = '解析昨天的日誌並透過 LLM 產生運維摘要';

    public function handle()
    {
        $logPath = storage_path('logs/laravel.log');
        if (!File::exists($logPath)) {
            $this->info('沒有找到日誌檔案。');
            return;
        }

        $logs = File::get($logPath);
        // 簡易的正則匹配,抓取昨天的 ERROR
        $yesterday = now()->subDay()->format('Y-m-d');
        preg_match_all("/\[{$yesterday}.*?\].*?local\.ERROR: (.*?)(?=\[\d{4}-\d{2}-\d{2}|\z)/s", $logs, $matches);

        $errors = $matches[1] ?? [];
        if (empty($errors)) {
            $this->info('昨天系統一切平安,沒有錯誤!');
            return;
        }

        // 去重與計算發生頻率
        $errorCounts = array_count_values(array_map(function ($err) {
            // 截斷過長的 Stack trace,只取第一行作為特徵
            return Str::limit(explode("\n", $err)[0], 200);
        }, $errors));

        $this->callLLM($errorCounts);
    }
}

工程師的囉嗦時間:記得一定要做字串截斷!很多 Exception 帶有超長的 Stack Trace,如果全塞給 LLM,你的 API 帳單月底會讓你哭出來。

步驟二:與 LLM 互動 (Prompt 規劃)

接下來,我們要撰寫一個精準的 System Prompt,要求 LLM 將錯誤進行分類,並給出修復建議。在 2026 年,我們通常會強制 LLM 回傳 JSON 格式,方便後續系統解析。


private function callLLM(array $errorCounts)
{
    $prompt = "你是一位資深 Laravel 運維工程師。以下是昨日系統發生的錯誤與頻率:\n";
    $prompt .= json_encode($errorCounts, JSON_UNESCAPED_UNICODE);
    $prompt .= "\n請將這些錯誤分類為:【嚴重警告】、【API/第三方異常】、【輕微例外】。\n";
    $prompt .= "請摘要最主要的錯誤原因,並給出優先處理建議。\n";
    $prompt .= "請務必以繁體中文回答,並保持精簡專業。";

    // 這裡假設你已經整合了 openai-php/client 或類似的套件
    $response = \OpenAI::chat()->create([
        'model' => 'gpt-4o',
        'messages' => [
            ['role' => 'system', 'content' => '你是一個專注於 Laravel 系統監控的 AI 助理。'],
            ['role' => 'user', 'content' => $prompt],
        ],
    ]);

    $analysis = $response->choices[0]->message->content;
    $this->sendToSlack($analysis);
}

步驟三:設定 Laravel Scheduler

邏輯寫好之後,只需要在 routes/console.php (在較新的 Laravel 版本中,排程器已移至此處) 註冊這個任務即可。


use Illuminate\Support\Facades\Schedule;

// 每天早上 8:30 準時發送日誌分析早報
Schedule::command('logs:analyze-daily')->dailyAt('08:30')->onOneServer();

加上 onOneServer() 是一個好習慣,如果你有部署多台 Worker,這能確保每天只會有一台機器去執行日誌分析,避免你的 Slack 被同樣的報告洗版。

ROI:導入這套架構後的真實效益

Laravel 任務排程 (Scheduler) 結合 LLM:自動摘要、分類並分析每日系統錯誤日誌 後,我們的團隊感受到了質的飛躍:

  • 節省超過 80% 的排錯時間: 以前需要工程師花 30 分鐘大海撈針,現在 AI 已經幫你整理出「昨天金流 API Timeout 發生了 150 次,建議檢查防火牆設定」。
  • 消滅警報疲勞: 日常輕微的 404 錯誤會被 AI 歸類在「輕微例外」,不會再讓你感到焦慮。
  • 知識傳承: LLM 給出的修復建議,對於新進的 Junior 工程師來說是非常棒的學習教材。

如果你也受夠了每天對著冰冷的 Log 檔案發呆,強烈建議在你的 Laravel 專案中實作這套流程。技術的演進是為了解放工程師的雙手,讓我們能專注在更有價值的商業邏輯架構上。

相關閱讀

如果你對 Laravel 與 AI 自動化運維有興趣,強烈建議閱讀我們為 2026 年整理的最新實戰指南:

想為您的企業導入 AI 自動化運維與專屬的 Laravel 系統開發嗎?交給經驗豐富的技術夥伴為您把關!歡迎前往 浪花科技聯絡表單 填寫需求,我們將有專人與您探討最佳的技術解決方案!

// FAQ

常見問題

Sentry、ELK 這類工具不夠用嗎,為什麼還要用 LLM 分析日誌?
這類工具擅長收集與告警,但解決的不是分析與洞察。它們會造成警報疲勞,能指出哪一行出錯卻缺乏上下文關聯,也難以自動分辨輕重緩急。導入 LLM 可讓 AI 扮演初階運維角色,把雜亂日誌轉成結構化、可執行的行動指南。
把 Laravel 日誌交給 LLM 分析前為什麼要先在本地聚合與清洗?
直接把整份 laravel.log 丟給 LLM 會造成 Token 費用超標,還可能洩漏使用者個資。應先在本地萃取 Error 等級以上的日誌、做去重與發生頻率統計,並對含超長 Stack Trace 的訊息做字串截斷,只取關鍵特徵後再送出。
如何讓 LLM 的日誌分析結果方便系統後續處理?
在 System Prompt 中要求 LLM 把錯誤分類,例如分為嚴重警告、API 或第三方異常、輕微例外,並摘要主要原因與優先處理建議。實務上會強制 LLM 回傳結構化的 JSON 格式,方便後續系統解析與自動化通知。
怎麼讓這套日誌分析每天定時自動執行?
把分析邏輯封裝成 Laravel 的 Console Command,再透過 Laravel Scheduler 排程定時觸發,例如每天早上固定時間執行並把報告推送到 Slack 或 Teams。在較新的 Laravel 版本中,排程任務已可註冊於 routes/console.php。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。

$
// final.exec()

準備好讓你的網站開始為你工作了嗎?