Laravel 基於 Monolog 封裝了強大的日誌系統,並提供統一的例外處理入口。本文深入講解如何實現「不同業務日誌分檔」、「簡化錯誤堆疊」、「啟用每日分割」、「記錄 SQL 查詢」以及「API 統一錯誤回應」等實務需求。
預設日誌寫入 storage/logs/laravel.log,若需將訂單、店鋪、API 等日誌分開:
useDailyFiles(storage_path("logs/{$type}.log"), $days);
}
return self::$loggers[$type];
}
}
使用方式:BLogger::getLogger('order')->info($orderData); 寫入 storage/logs/order-YYYY-MM-DD.log。
編輯 app/start/global.php(Laravel 4/5.0)或 app/Exceptions/Handler.php(Laravel 5.1+):
App::error(function(\Exception $e, $code) {
Log::error($e); // 仍保留完整堆疊到預設日誌
$err = [
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'code' => $e->getCode(),
'url' => Request::url(),
'input' => Input::all(),
];
BLogger::getLogger(BLogger::LOG_ERROR)->error($err); // 精簡版寫入 error.log
// API 統一回應 JSON
return Response::json(['status' => 0, 'error' => '伺服器內部錯誤'], 500);
});
App::missing(function($exception) {
return Response::json(['status' => 0, 'error' => '請求路徑不存在'], 404);
});
// global.php 或 bootstrap/app.php
Log::useDailyFiles(storage_path('logs/laravel.log'), 30); // 保留 30 天
// App::after 或中間件 terminate
App::after(function($request, $response) {
if (Config::get('query.log', false)) {
$queries = DB::getQueryLog(); // 需先 DB::enableQueryLog()
BLogger::getLogger('query')->info($queries);
}
});
if (Config::get('database.log', false)) {
Event::listen('illuminate.query', function($query, $bindings, $time, $name) {
$data = compact('query', 'bindings', 'time', 'name');
BLogger::getLogger('query_realtime')->info($data);
});
}
注意:DB::enableQueryLog() 會增加記憶體佔用,高併發環境建議僅在開發/測試環境啟用。
// app/Exceptions/Handler.php
public function report(\Throwable $e) {
if ($this->shouldReport($e)) {
BLogger::getLogger('error')->error([
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => $e->getTraceAsString(),
]);
}
parent::report($e);
}
public function render($request, \Throwable $e) {
if ($request->expectsJson()) {
return response()->json(['status' => 0, 'error' => 'Server Error'], 500);
}
return parent::render($request, $e);
}
善用 Laravel 的日誌與例外機制,能讓系統在生產環境具備完善的可觀測性,快速定位並解決問題!