Laravel 日誌系統(Logging)

Laravel 提供了強大的日誌功能,用於追蹤應用程式中的事件、錯誤與除錯資訊。日誌可依據需求寫入不同通道(channel),並設定不同的儲存方式與格式。


一、基本介紹

Laravel 使用 Monolog 套件作為日誌底層,並透過 config/logging.php 設定統一管理日誌通道與等級。


二、日誌通道設定(config/logging.php)

logging.php 設定檔中定義了所有可用的通道,Laravel 預設啟用 stack 通道,允許將多個通道堆疊起來一起寫入。

常見通道類型:

通道 說明
stack 預設通道,可整合多個通道
single 單一日誌檔案(預設為 storage/logs/laravel.log
daily 每日產生日誌檔案,並保留指定天數
slack 發送日誌訊息至 Slack(需設定 webhook)
syslog / errorlog 使用作業系統的 syslog/errorlog
null 忽略所有日誌訊息(測試用途)

範例:daily 通道設定

'daily' => [
    'driver' => 'daily',
    'path' => storage_path('logs/laravel.log'),
    'level' => 'debug',
    'days' => 14,
],
  • driver: 使用的日誌處理方式
  • path: 儲存日誌檔的路徑
  • level: 最低紀錄等級(見下節)
  • days: 日誌保留天數

三、日誌等級(Level)

日誌級別依照嚴重程度從高到低排序如下:

emergency > alert > critical > error > warning > notice > info > debug

等級用途對照:

等級 用途說明
emergency 系統不可使用(例如:整個網站當機)
alert 必須立即處理(例如:資料庫失效)
critical 關鍵錯誤(例如:應用程式錯誤、無法處理請求)
error 一般錯誤(例如:例外、資源未找到)
warning 潛在錯誤警告(例如:磁碟空間即將不足)
notice 正常但重要事件(例如:使用者登入)
info 一般性訊息(例如:工作排程執行成功)
debug 除錯資訊,詳細描述系統內部狀態

注意:
Log 只會記錄等級高於或等於通道設定的等級之訊息。


四、寫入日誌

Laravel 提供簡潔的 Log facade 寫入日誌。

寫入預設通道(通常為 stack)

use Illuminate\Support\Facades\Log;

Log::error('發生錯誤');
Log::info('用戶登入', ['user_id' => 123]);

寫入指定通道

Log::channel('slack')->alert('系統異常,請即時處理!');
Log::channel('daily')->debug('除錯訊息');

五、自訂通道與多通道堆疊

自訂通道範例

'custom' => [
    'driver' => 'single',
    'path' => storage_path('logs/custom.log'),
    'level' => 'info',
],

堆疊通道設定

'stack' => [
    'driver' => 'stack',
    'channels' => ['daily', 'slack'],
    'ignore_exceptions' => false,
],

六、其他補充

實用技巧:

  • 可搭配 .env 檔案切換通道或等級:
LOG_CHANNEL=daily
LOG_LEVEL=warning
  • 使用 context 附帶額外資訊:
Log::info('訂單已建立', ['order_id' => 1001, 'amount' => 599]);
  • 可結合 Laravel Exception Handler,在 app/Exceptions/Handler.phpreport() 方法中客製例外記錄方式。

七、常見應用實例

排程記錄執行狀況

Log::channel('daily')->info('排程開始執行:SendEmailJob');

例外報錯通知 Slack

Log::channel('slack')->critical('付款失敗', ['order_id' => 1001]);

參考文件