首頁 > php教程 > PHP开发 > 主體

Laravel 5.3 學習筆記之 錯誤&日誌

高洛峰
發布: 2016-12-22 15:56:45
原創
1062 人瀏覽過

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);
}
登入後複製

   

4、HTTP異常


有些異常描述來自伺服器的HTTP錯誤碼,例如,這可能是「頁找不到」錯誤(404),「認證失敗錯誤」(401)亦或是程式出錯造成的500錯誤,為了在應用程式中產生這樣的回應,可以使用abort方法:

abort(404);


abort方法會立即引發一個會被異常處理器渲染的異常,此外,你還可以像這樣提供回應描述:

abort(403, 'Unauthorized action.');


該方法可在請求生命週期的任何時間點使用。

自訂HTTP錯誤頁面

在Laravel中,返回不同HTTP狀態碼的錯誤頁面很簡單,例如,如果你想要自訂404錯誤頁面,建立一個resources/views/errors/404.blade.php檔案,該視圖檔案用於渲染程式傳回的所有404錯誤。需要注意的是,該目錄下的視圖命名應該和對應的HTTP狀態碼相符。

5、日誌


Laravel基於強大的Monolog庫提供了簡單的日誌抽象層,預設情況下,Laravel被配置為在storage/logs目錄下每天為應用生成日誌文件,你可以使用Log門面記錄日誌資訊到日誌中:

<?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(&#39;Showing user profile for user: &#39;.$id);
    return view(&#39;user.profile&#39;, [&#39;user&#39; => 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中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!