Laravel 5.3 學(xué)習(xí)筆記之 錯(cuò)誤&日志
1、簡(jiǎn)介
Laravel默認(rèn)已經(jīng)為我們配置好了錯(cuò)誤和異常處理,我們?cè)贏pp\Exceptions\Handler類中觸發(fā)異常并將響應(yīng)返回給用戶。本教程我們將深入探討這個(gè)類。
此外,Laravel還集成了Monolog日志庫(kù)以便提供各種功能強(qiáng)大的日志處理器,默認(rèn)情況下,Laravel已經(jīng)為我們配置了一些處理器,我們可以選擇單個(gè)日志文件,也可以選擇記錄錯(cuò)誤信息到系統(tǒng)日志。
2、配置
錯(cuò)誤詳情顯示
配置文件config/app.php中的debug配置項(xiàng)控制瀏覽器顯示的錯(cuò)誤詳情數(shù)量。默認(rèn)情況下,該配置項(xiàng)通過.env文件中的環(huán)境變量APP_DEBUG進(jìn)行設(shè)置。
對(duì)本地開發(fā)而言,你應(yīng)該設(shè)置環(huán)境變量APP_DEBUG值為true。在生產(chǎn)環(huán)境,該值應(yīng)該被設(shè)置為false。如果在生產(chǎn)環(huán)境被設(shè)置為true,就有可能將一些敏感的配置值暴露給終端用戶。
日志存儲(chǔ)
默認(rèn)情況下,Laravel支持日志方法single, daily, syslog 和 errorlog。如果你想要日志文件按日生成而不是生成單個(gè)文件,應(yīng)該在配置文件config/app.php中設(shè)置log值如下:
'log' => 'daily'
日志文件最大生命周期
使用daily日志模式的時(shí)候,Laravel默認(rèn)最多為我們保留最近5天的日志,如果你想要修改這個(gè)時(shí)間,需要添加一個(gè)配置log_max_files到app配置文件:
'log_max_files' => 30
日志錯(cuò)誤級(jí)別
使用Monolog的時(shí)候,日志消息可能有不同的錯(cuò)誤級(jí)別,默認(rèn)情況下,Laravel將所有日志寫到storage目錄,但是在生產(chǎn)環(huán)境中,你可能想要配置最低錯(cuò)誤級(jí)別,這可以通過在配置文件app.php中通過添加配置項(xiàng) log_level 來實(shí)現(xiàn)。
該配置項(xiàng)被配置后,Laravel會(huì)記錄所有錯(cuò)誤級(jí)別大于等于這個(gè)指定級(jí)別的日志,例如,默認(rèn) log_level 是 error ,則將會(huì)記錄error、critical、alert以及emergency級(jí)別的日志信息:
'log_level' => env('APP_LOG_LEVEL', 'error'),
注:Monolog支持以下錯(cuò)誤級(jí)別 —— debug、info、notice、warning、error、critical、alert、emergency。
自定義Monolog配置
如果你想要在應(yīng)用中完全控制Monolog的配置,可以使用configureMonologUsing方法。你需要在bootstrap/app.php文件返回$app變量之前調(diào)用該方法:
$app->configureMonologUsing(function($monolog) { $monolog->pushHandler(...); }); return $app;
3、異常處理器
所有異常都由類App\Exceptions\Handler處理,該類包含兩個(gè)方法:report和render。下面我們?cè)敿?xì)闡述這兩個(gè)方法。
report方法
report方法用于記錄異常并將其發(fā)送給外部服務(wù)如Bugsnag或Sentry,默認(rèn)情況下,report方法只是將異常傳遞給異常被記錄的基類,當(dāng)然你也可以按自己的需要記錄異常并進(jìn)行相關(guān)處理。
例如,如果你需要以不同方式報(bào)告不同類型的異常,可使用PHP的instanceof比較操作符:
/** * 報(bào)告或記錄異常 * * 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屬性包含一個(gè)不會(huì)被記錄的異常類型數(shù)組,默認(rèn)情況下,404錯(cuò)誤異常不會(huì)被寫到日志文件,如果需要的話你可以添加其他異常類型到這個(gè)數(shù)組:
/** * 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方法
render方法負(fù)責(zé)將給定異常轉(zhuǎn)化為發(fā)送給瀏覽器的HTTP響應(yīng),默認(rèn)情況下,異常被傳遞給為你生成響應(yīng)的基類。當(dāng)然,你也可以按照自己的需要檢查異常類型或者返回自定義響應(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); }
4、HTTP異常
有些異常描述來自服務(wù)器的HTTP錯(cuò)誤碼,例如,這可能是一個(gè)“頁(yè)面未找到”錯(cuò)誤(404),“認(rèn)證失敗錯(cuò)誤”(401)亦或是程序出錯(cuò)造成的500錯(cuò)誤,為了在應(yīng)用中生成這樣的響應(yīng),可以使用abort方法:
abort(404);
abort方法會(huì)立即引發(fā)一個(gè)會(huì)被異常處理器渲染的異常,此外,你還可以像這樣提供響應(yīng)描述:
abort(403, 'Unauthorized action.');
該方法可在請(qǐng)求生命周期的任何時(shí)間點(diǎn)使用。
自定義HTTP錯(cuò)誤頁(yè)面
在Laravel中,返回不同HTTP狀態(tài)碼的錯(cuò)誤頁(yè)面很簡(jiǎn)單,例如,如果你想要自定義404錯(cuò)誤頁(yè)面,創(chuàng)建一個(gè)resources/views/errors/404.blade.php文件,該視圖文件用于渲染程序返回的所有404錯(cuò)誤。需要注意的是,該目錄下的視圖命名應(yīng)該和相應(yīng)的HTTP狀態(tài)碼相匹配。
5、日志
Laravel基于強(qiáng)大的Monolog庫(kù)提供了簡(jiǎn)單的日志抽象層,默認(rèn)情況下,Laravel被配置為在storage/logs目錄下每天為應(yīng)用生成日志文件,你可以使用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('Showing user profile for user: '.$id); return view('user.profile', ['user' => User::findOrFail($id)]); } }
該日志記錄器提供了RFC 5424中定義的八種日志級(jí)別: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);
上下文信息
上下文數(shù)據(jù)也會(huì)以數(shù)組形式傳遞給日志方法,然后和日志消息一起被格式化和顯示:
Log::info('User failed to login.', ['id' => $user->id]);
訪問底層Monolog實(shí)例
Monolog有多個(gè)可用于日志的處理器,如果需要的話,你可以訪問Laravel使用的底層Monolog實(shí)例:
$monolog = Log::getMonolog();
- Laravel5.1自定義500錯(cuò)誤頁(yè)面示例
- Laravel框架基于中間件實(shí)現(xiàn)禁止未登錄用戶訪問頁(yè)面功能示例
- laravel 框架配置404等異常頁(yè)面
- Laravel 5.4重新登錄實(shí)現(xiàn)跳轉(zhuǎn)到登錄前頁(yè)面的原理和方法
- Laravel框架FormRequest中重寫錯(cuò)誤處理的方法
- Laravel中錯(cuò)誤與異常處理的用法示例
- laravel 5異常錯(cuò)誤:FatalErrorException in Handler.php line 38的解決
- laravel migrate初學(xué)常見錯(cuò)誤的解決方法
- Laravel實(shí)現(xiàn)自定義錯(cuò)誤輸出內(nèi)容的方法
- Laravel中常見的錯(cuò)誤與解決方法小結(jié)
- Laravel5框架自定義錯(cuò)誤頁(yè)面配置操作示例
相關(guān)文章
PHP接入Apple對(duì)access_token/identityToken進(jìn)行JWT驗(yàn)證流程詳解
JWT(JSON Web Token)是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)。本文將為大家介紹PHP如何實(shí)現(xiàn)JWT登錄鑒權(quán),需要的可以參考一下2022-09-09PHP實(shí)現(xiàn)的memcache環(huán)形隊(duì)列類實(shí)例
這篇文章主要介紹了PHP實(shí)現(xiàn)的memcache環(huán)形隊(duì)列類,實(shí)例分析了基于memcache實(shí)現(xiàn)環(huán)形隊(duì)列的方法,涉及memcache緩存及隊(duì)列的相關(guān)技巧,需要的朋友可以參考下2015-07-07PHP頁(yè)面靜態(tài)化的優(yōu)缺點(diǎn)與實(shí)現(xiàn)
眾所周知,頁(yè)面靜態(tài)化是門戶網(wǎng)站研發(fā)中必備的一項(xiàng)技能,本課程從純靜態(tài)化和偽靜態(tài)化兩個(gè)角度進(jìn)行分析,帶領(lǐng)大家掌握在PHP中如何生成純靜態(tài)化頁(yè)面,在WEB服務(wù)器中如何配置偽靜態(tài),幫助大家掌握又一項(xiàng)加薪利器2023-02-02一文總結(jié)常用PHP業(yè)務(wù)邏輯demo
這篇文章主要為大家介紹了常用PHP業(yè)務(wù)邏輯的demo總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06PHP utf-8編碼問題,utf8編碼,數(shù)據(jù)庫(kù)亂碼,頁(yè)面顯示輸出亂碼
老聲長(zhǎng)談,著是困惑很多人的問題,如果處理不好,都是亂碼,說這些話并不是我對(duì)編碼很精通,只是在這方面是得留神,自己總結(jié)了一點(diǎn)小經(jīng)驗(yàn)2013-04-04PHP大批量數(shù)據(jù)操作時(shí)臨時(shí)調(diào)整內(nèi)存與執(zhí)行時(shí)間的方法
PHP大批量數(shù)據(jù)操作時(shí)臨時(shí)調(diào)整內(nèi)存與執(zhí)行時(shí)間的方法 ,因?yàn)檫\(yùn)行的程序會(huì)很大很慢所以需要臨時(shí)設(shè)置下。不用修改php.ini參數(shù)了。2011-04-04php使用gettimeofday函數(shù)返回當(dāng)前時(shí)間并存放在關(guān)聯(lián)數(shù)組里
這篇文章主要介紹了php使用gettimeofday函數(shù)返回當(dāng)前時(shí)間并存放在關(guān)聯(lián)數(shù)組里的方法,涉及php中g(shù)ettimeofday函數(shù)的使用技巧,需要的朋友可以參考下2015-03-03