1、簡介
Laravel預設已經為我們配置好了錯誤和異常處理,我們在AppExceptionsHandler類別中觸發異常並將回應傳回給使用者。本教學我們將深入探討這個類別。
此外,Laravel還整合了Monolog日誌庫以便提供各種功能強大的日誌處理器,預設情況下,Laravel已經為我們配置了一些處理器,我們可以選擇單一日誌文件,也可以選擇記錄錯誤訊息到系統日誌。
2、設定
錯誤詳情顯示
設定檔config/app.php中的debug配置項目控制瀏覽器顯示的錯誤詳情數量。預設情況下,此配置項透過.env檔案中的環境變數APP_DEBUG進行設定。
對本地開發而言,你應該設定環境變數APP_DEBUG值為true。在生產環境,該值應該被設定為false。如果在生產環境被設定為true,就有可能將一些敏感的配置值暴露給終端使用者。
日誌儲存
預設情況下,Laravel支援日誌方法single, daily, syslog 和 errorlog。如果你想要日誌檔案按日產生而不是產生單一文件,應該在設定檔config/app.php中設定log值如下:
'log' => 'daily'
日誌檔案最大生命週期
使用daily日誌模式的時候,Laravel預設最多為我們保留最近5天的日誌,如果你想要修改這個時間,需要加入一個設定log_max_files到app設定檔:
'log_max_files' => 30
日誌錯誤級別
使用Monolog的時候,日誌訊息可能有不同的錯誤級別,預設情況下,Laravel將所有日誌寫到storage目錄,但是在生產環境中,你可能想要配置最低錯誤級別,這可以透過在配置文件app.php中透過新增配置項log_level 來實現。
該配置項目被配置後,Laravel會記錄所有錯誤等級大於等於這個指定等級的日誌,例如,預設log_level 是error ,則將會記錄error、critical、alert以及emergency等級的日誌資訊:
'log_level ' => env('APP_LOG_LEVEL', 'error'),
註:Monolog支援下列錯誤等級- debug、info、notice、warning、error、critical、alert、emergency。
自訂Monolog配置
如果你想要在應用程式中完全控制Monolog的配置,可以使用configureMonologUsing方法。你需要在bootstrap/app.php檔案回傳$app變數之前呼叫該方法:
$app->configureMonologUsing(function($monolog) { $monolog->pushHandler(...); }); return $app;
3、異常處理器
所有異常都由類別AppExceptionsHandler render。下面我們將詳細闡述這兩個方法。
report方法
report方法用於記錄異常並將其發送給外部服務如Bugsnag或Sentry,預設情況下,report方法只是將異常傳遞給異常被記錄的基類,當然你也可以按自己的需要記錄異常並進行相關處理。
例如,如果你需要以不同方式報告不同類型的異常,可使用PHP的instanceof比較操作符:
/** * 报告或记录异常 * * This is a great spot to send exceptions to Sentry, Bugsnag, etc. * * @param \Exception $e * @return void */ public function report(Exception $e){ if ($e instanceof CustomException) { // } return parent::report($e); }
透過類型忽略異常時
處理器異常的$dontReport記錄的異常類型數組,預設情況下,404錯誤異常不會被寫到日誌文件,如果需要的話你可以添加其他異常類型到這個數組:
/** * A list of the exception types that should not be reported. * * @var array */ protected $dontReport = [ \Illuminate\Auth\AuthenticationException::class, \Illuminate\Auth\Access\AuthorizationException::class, \Symfony\Component\HttpKernel\Exception\HttpException::class, \Illuminate\Database\Eloquent\ModelNotFoundException::class, \Illuminate\Validation\ValidationException::class, ];
render方法
定異常轉化為發送給瀏覽器的HTTP回應,預設情況下,異常會傳遞給為你產生回應的基底類別。當然,你也可以按照自己的需求檢查異常類型或返回自訂回應:/** * 将异常渲染到HTTP响应中 * * @param \Illuminate\Http\Request $request * @param \Exception $e * @return \Illuminate\Http\Response */ public function render($request, Exception $e){ if ($e instanceof CustomException) { return response()->view('errors.custom', [], 500); } return parent::render($request, $e); }
<?php namespace App\Http\Controllers; use Log; use App\User; use App\Http\Controllers\Controller; class UserController extends Controller{ /** * 显示指定用户的属性 * * @param int $id * @return Response */ public function showProfile($id) { Log::info('Showing user profile for user: '.$id); return view('user.profile', ['user' => User::findOrFail($id)]); } }
此日誌記錄器提供了RFC 5424中定義的八種日誌等級:emergency、alert、critical、error、warning、notice、info 和 debug。
Log::emergency($error);
Log::alert($error);
Log::critical($error);
Log::error($error);
Log::warning($error) ;
Log::notice($error);
Log::info($error);
Log::debug($error);
上下文資訊
上下文資料也會以陣列形式傳遞給然後和日誌訊息一起格式化和顯示:
Log::info('User failed to login.', ['id' => $user->id]);
存取底層Monolog實例
Monolog有多個可用於日誌的處理器,如果需要的話,你可以訪問Laravel使用的底層Monolog實例:
$monolog = Log::getMonolog();
更多Laravel 5.3 學習筆記之錯誤&日誌相關文章請關注PHP中文網!