《PHP學(xué)習(xí):Laravel 5.3 學(xué)習(xí)筆記之 錯誤&日志》要點:
本文介紹了PHP學(xué)習(xí):Laravel 5.3 學(xué)習(xí)筆記之 錯誤&日志,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP應(yīng)用1、簡介
PHP應(yīng)用Laravel默認已經(jīng)為我們配置好了錯誤和異常處理,我們在App\Exceptions\Handler類中觸發(fā)異常并將響應(yīng)返回給用戶.本教程我們將深入探討這個類.
PHP應(yīng)用此外,Laravel還集成了Monolog日志庫以便提供各種功能強大的日志處理器,默認情況下,Laravel已經(jīng)為我們配置了一些處理器,我們可以選擇單個日志文件,也可以選擇記錄錯誤信息到系統(tǒng)日志.
PHP應(yīng)用2、配置
PHP應(yīng)用錯誤詳情顯示
PHP應(yīng)用配置文件config/app.php中的debug配置項控制瀏覽器顯示的錯誤詳情數(shù)量.默認情況下,該配置項通過.env文件中的環(huán)境變量APP_DEBUG進行設(shè)置.
PHP應(yīng)用對本地開發(fā)而言,你應(yīng)該設(shè)置環(huán)境變量APP_DEBUG值為true.在生產(chǎn)環(huán)境,該值應(yīng)該被設(shè)置為false.如果在生產(chǎn)環(huán)境被設(shè)置為true,就有可能將一些敏感的配置值暴露給終端用戶.
PHP應(yīng)用日志存儲
PHP應(yīng)用默認情況下,Laravel支持日志方法single, daily, syslog 和 errorlog.如果你想要日志文件按日生成而不是生成單個文件,應(yīng)該在配置文件config/app.php中設(shè)置log值如下:
PHP應(yīng)用'log' => 'daily'
PHP應(yīng)用日志文件最大生命周期
PHP應(yīng)用使用daily日志模式的時候,Laravel默認最多為我們保留最近5天的日志,如果你想要修改這個時間,需要添加一個配置log_max_files到app配置文件:
PHP應(yīng)用'log_max_files' => 30
PHP應(yīng)用日志錯誤級別
PHP應(yīng)用使用Monolog的時候,日志消息可能有不同的錯誤級別,默認情況下,Laravel將所有日志寫到storage目錄,但是在生產(chǎn)環(huán)境中,你可能想要配置最低錯誤級別,這可以通過在配置文件app.php中通過添加配置項 log_level 來實現(xiàn).
PHP應(yīng)用該配置項被配置后,Laravel會記錄所有錯誤級別大于等于這個指定級別的日志,例如,默認 log_level 是 error ,則將會記錄error、critical、alert以及emergency級別的日志信息:
PHP應(yīng)用'log_level' => env('APP_LOG_LEVEL', 'error'),
PHP應(yīng)用注:Monolog支持以下錯誤級別 ―― debug、info、notice、warning、error、critical、alert、emergency.
自定義Monolog配置
PHP應(yīng)用如果你想要在應(yīng)用中完全控制Monolog的配置,可以使用configureMonologUsing方法.你需要在bootstrap/app.php文件返回$app變量之前調(diào)用該方法:
PHP應(yīng)用
$app->configureMonologUsing(function($monolog) {
$monolog->pushHandler(...);
});
return $app;
PHP應(yīng)用3、異常處理器
PHP應(yīng)用所有異常都由類App\Exceptions\Handler處理,該類包含兩個方法:report和render.下面我們詳細闡述這兩個方法.
PHP應(yīng)用report方法
PHP應(yīng)用report方法用于記錄異常并將其發(fā)送給外部服務(wù)如Bugsnag或Sentry,默認情況下,report方法只是將異常傳遞給異常被記錄的基類,當(dāng)然你也可以按自己的需要記錄異常并進行相關(guān)處理.
PHP應(yīng)用例如,如果你需要以不同方式報告不同類型的異常,可使用PHP的instanceof比較操作符:
PHP應(yīng)用
/**
* 報告或記錄異常
*
* 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);
}
PHP應(yīng)用通過類型忽略異常
PHP應(yīng)用異常處理器的$dontReport屬性包含一個不會被記錄的異常類型數(shù)組,默認情況下,404錯誤異常不會被寫到日志文件,如果需要的話你可以添加其他異常類型到這個數(shù)組:
PHP應(yīng)用
/**
* 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,
];
PHP應(yīng)用render方法
PHP應(yīng)用render方法負責(zé)將給定異常轉(zhuǎn)化為發(fā)送給瀏覽器的HTTP響應(yīng),默認情況下,異常被傳遞給為你生成響應(yīng)的基類.當(dāng)然,你也可以按照自己的需要檢查異常類型或者返回自定義響應(yīng):
PHP應(yīng)用
/**
* 將異常渲染到HTTP響應(yīng)中
*
* @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應(yīng)用4、HTTP異常
PHP應(yīng)用有些異常描述來自服務(wù)器的HTTP錯誤碼,例如,這可能是一個“頁面未找到”錯誤(404),“認證失敗錯誤”(401)亦或是程序出錯造成的500錯誤,為了在應(yīng)用中生成這樣的響應(yīng),可以使用abort方法:
PHP應(yīng)用abort(404);
PHP應(yīng)用abort方法會立即引發(fā)一個會被異常處理器渲染的異常,此外,你還可以像這樣提供響應(yīng)描述:
PHP應(yīng)用abort(403, 'Unauthorized action.');
PHP應(yīng)用該方法可在請求生命周期的任何時間點使用.
PHP應(yīng)用自定義HTTP錯誤頁面
PHP應(yīng)用在Laravel中,返回不同HTTP狀態(tài)碼的錯誤頁面很簡單,例如,如果你想要自定義404錯誤頁面,創(chuàng)建一個resources/views/errors/404.blade.php文件,該視圖文件用于渲染程序返回的所有404錯誤.需要注意的是,該目錄下的視圖命名應(yīng)該和相應(yīng)的HTTP狀態(tài)碼相匹配.
PHP應(yīng)用5、日志
PHP應(yīng)用Laravel基于強大的Monolog庫提供了簡單的日志抽象層,默認情況下,Laravel被配置為在storage/logs目錄下每天為應(yīng)用生成日志文件,你可以使用Log門面記錄日志信息到日志中:
PHP應(yīng)用
<?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)]);
}
}
PHP應(yīng)用該日志記錄器提供了RFC 5424中定義的八種日志級別:emergency、alert、critical、error、warning、notice、info 和 debug.
PHP應(yīng)用Log::emergency($error);
Log::alert($error);
Log::critical($error);
Log::error($error);
Log::warning($error);
Log::notice($error);
Log::info($error);
Log::debug($error);
PHP應(yīng)用上下文信息
PHP應(yīng)用上下文數(shù)據(jù)也會以數(shù)組形式傳遞給日志方法,然后和日志消息一起被格式化和顯示:
PHP應(yīng)用Log::info('User failed to login.', ['id' => $user->id]);
PHP應(yīng)用訪問底層Monolog實例
PHP應(yīng)用Monolog有多個可用于日志的處理器,如果需要的話,你可以訪問Laravel使用的底層Monolog實例:
PHP應(yīng)用$monolog = Log::getMonolog();
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/3959.html