在使用laravel框架進行開發過程中,難免會出現各種錯誤或異常。如何快速排查錯誤并解決問題,是基礎開發者面臨的挑戰。本文將為您介紹laravel報錯的排查方法,幫助您在開發過程中事半功倍。
一、日志記錄
Laravel會將日志信息按照不同等級(debug、info、notice、warning、Error、critical、alert、emergency)分別記錄在不同文件中。我們可以通過查看日志文件來快速找出代碼中出現的錯誤。
1.1 查看日志文件
打開項目根目錄中的storage/logs目錄,可以看到laravel.log文件,這個是系統所有級別日志 的總日志文件,如果想以某種級別來分集日志記錄,可在config/Logging.php 文件中進行配置;
在日志文件中,可以針對時間、進程、級別等條件進行篩選查看錯誤信息。具體使用方式如下:
tail -f storage/logs/laravel.log // 監控最新的日志內容,按Ctrl+C停止 cat storage/logs/laravel.log | grep '關鍵字' // 搜索包含"關鍵字"的日志內容 tail -n 100 storage/logs/laravel.log | grep '關鍵字' // 查看最后100行日志是否包含"關鍵字"
1.2 級別設置
通過 Laravel 自帶的目錄 app/Exceptions/Handler.php 類,可以看到日志的級別設置在了 report() 函數的第一個參數中,Laravel 默認的日志級別為 error,這意味著,只有 error 級別及以上的日志會被記錄在 app/public/storage/logs/laravel.log 日志文件中。
如果想要將 warning 級別及以上的日志都寫入日志文件,可以在report() 函數的第一個參數中添加起始級別,如下所示:
public function report(Exception $exception) { if ($this->shouldReport($exception)) { Log::channel('daily')->warning('遇到錯誤啦!', [ 'error' => $exception->getMessage() ]); } parent::report($exception); }
通過Log::channel(‘daily’)->warning()操作,將錯誤信息與級別一起寫入日志,并通過shouldReport() 方法判斷是否需要寫入日志。
二、異常處理
在Laravel應用中,拋出自定義異常的方式非常簡單,只需進行以下操作即可:
2.1 自定義異常
創建一個新的異常類,并繼承Laravel默認的Exception類,如下所示:
namespace AppExceptions; use Exception; class CustomException extends Exception { public function __construct($message = null, $code = 0) { parent::__construct($message, $code); // 調用父類的構造方法 } public function report() { // 記錄錯誤日志 Log::error('CustomException:'.$this->getMessage()); } public function render($request) { return response()->json(['message' => $this->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } }
在構造方法中,我們可以定義異常信息及狀態碼,并在 report() 方法中記錄錯誤日志,在 render() 方法中返回JSON格式的異常信息及狀態碼。
當應用程序中出現了 CustomException時,Laravel會自動執行 report() 方法將錯誤信息記錄到日志文件中,并通過 render() 方法返回異常信息給前端顯示。
2.2 觸發異常
在代碼中使用 throw new CustomException ()方法即可拋出異常,如下所示:
public function test(Request $request) { // ... if (! check_validate($request->all())) { throw new CustomException('請求參數不正確'); } }
三、錯誤調試
在進行開發或測試時,有時需要在代碼中打出調試信息來方便查找問題所在,而在 Laravel 中,我們可以通過 dump() 和 dd() 兩個函數來快速輸出調試信息和中斷程序執行結果。
3.1 dump()和dd()
dump() 函數用于打印變量或者數組的內容,不會中斷程序的運行。類似于PHP內置的var_dump()函數。
dd() 函數不僅會打印變量或者數組的內容,還會中斷程序的執行,并且把處理到當前位置的代碼堆棧以及異常的具體信息都顯示出來。類似于PHP內置die() 或exit()函數。
Route::get('/test', function () { dump('Hello Laravel!'); return response()->json(['key' => 'value']); }); Route::get('/test2', function () { $array = ['key_one' => 'value_one', 'key_two' => 'value_two']; dd($array); return response()->json(['key' => 'value']); });
在上述代碼中,我們通過 dump() 和 dd() 方法來打印字符串和數組的內容,使用方式類似于PHP原生函數,非常方便。
四、結語
在Laravel開發過程中,由于各種原因,總會出現各種各樣的報錯信息。如何高效地排查并解決這些錯誤,是每個開發者必須面對的問題。本文中我們介紹了Laravel日志記錄、異常處理、錯誤調試等幾個常用的排查方式,希望對您在Laravel中開發有所幫助。