首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Laravel 錯誤處理與日誌記錄進階用法詳解

     編輯:PHP 綜合知識

Laravel 基於 Monolog 封裝了強大的日誌系統,並提供統一的例外處理入口。本文深入講解如何實現「不同業務日誌分檔」、「簡化錯誤堆疊」、「啟用每日分割」、「記錄 SQL 查詢」以及「API 統一錯誤回應」等實務需求。

1. 多業務日誌分檔:自訂 Logger 類別

預設日誌寫入 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。

2. 簡化錯誤堆疊:在 App::error 中記錄關鍵資訊

編輯 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);
});

3. 處理 404 例外

App::missing(function($exception) {
    return Response::json(['status' => 0, 'error' => '請求路徑不存在'], 404);
});

4. 啟用預設日誌每日分割

// global.php 或 bootstrap/app.php
Log::useDailyFiles(storage_path('logs/laravel.log'), 30); // 保留 30 天

5. 記錄 SQL 查詢日誌

非即時模式(請求結束後批次寫入)

// App::after 或中間件 terminate
App::after(function($request, $response) {
    if (Config::get('query.log', false)) {
        $queries = DB::getQueryLog(); // 需先 DB::enableQueryLog()
        BLogger::getLogger('query')->info($queries);
    }
});

即時模式(監聽 illuminate.query 事件)

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() 會增加記憶體佔用,高併發環境建議僅在開發/測試環境啟用。

6. Laravel 5.1+ 版本的 Handler.php 寫法

// 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 的日誌與例外機制,能讓系統在生產環境具備完善的可觀測性,快速定位並解決問題!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved