鍍金池/ 教程/ PHP/ 錯(cuò)誤&日志
門(mén)面
Laravel Homestead
安裝及配置
測(cè)試
HTTP 中間件
加密
升級(jí)指南
幫助函數(shù)
應(yīng)用目錄結(jié)構(gòu)
集合
新手入門(mén)指南-簡(jiǎn)單任務(wù)管理系統(tǒng)
任務(wù)調(diào)度
查詢(xún)構(gòu)建器
視圖
驗(yàn)證
Laravel Cashier(訂購(gòu)&支付&發(fā)票)
本地化
隊(duì)列
調(diào)整器
分頁(yè)
文件系統(tǒng)/云存儲(chǔ)
貢獻(xiàn)代碼
哈希
HTTP 控制器
緩存
遷移
HTTP 請(qǐng)求
Laravel Elixir
發(fā)行版本說(shuō)明
Envoy 任務(wù)運(yùn)行器(SSH任務(wù))
序列化
Session
起步
帶用戶(hù)功能的任務(wù)管理系統(tǒng)
起步
用戶(hù)授權(quán)
郵件
事件
填充數(shù)據(jù)
HTTP 路由
服務(wù)提供者
Blade 模板引擎
包開(kāi)發(fā)
用戶(hù)認(rèn)證
Artisan 控制臺(tái)
HTTP 響應(yīng)
集合
服務(wù)容器
關(guān)聯(lián)關(guān)系
一次請(qǐng)求的生命周期
契約
Redis
錯(cuò)誤&日志

錯(cuò)誤&日志

1、簡(jiǎn)介

開(kāi)始一個(gè) Laravel項(xiàng)目的時(shí)候,錯(cuò)誤和異常處理已經(jīng)默認(rèn)為你配置好了。此外,Laravel還集成了提供各種功能強(qiáng)大日志處理器的 Monolog日志庫(kù)。

2、配置

2.1 錯(cuò)誤詳情顯示

配置文件 config/app.php中的 debug配置選項(xiàng)控制瀏覽器顯示的錯(cuò)誤詳情數(shù)量。默認(rèn)情況下,該配置選項(xiàng)被設(shè)置在.env文件中的環(huán)境變量 APP_DEBUG。

對(duì)本地開(kāi)發(fā)而言,你應(yīng)該設(shè)置環(huán)境變量 APP_DEBUG值為 true。在生產(chǎn)環(huán)境,該值應(yīng)該被設(shè)置為 false

2.2 日志模式

Laravel 支持日志方法 single, daily, syslogerrorlog。例如,如果你想要日志文件按日生成而不是生成單個(gè)文件,應(yīng)該在配置文件 config/app.php中設(shè)置 log值如下:

'log' => 'daily'

2.3 自定義 Monolog 配置

如果你想要在應(yīng)用中完全控制 Monolog的配置,可以使用應(yīng)用的 configureMonologUsing方法。你應(yīng)該在 bootstrap/app.php文件返回$app 變量之前調(diào)用該方法:

$app->configureMonologUsing(function($monolog) {
    $monolog->pushHandler(...);
});

return $app;

3、異常處理器

所有異常都由類(lèi) App\Exceptions\Handler處理,該類(lèi)包含兩個(gè)方法:reportrender。下面我們?cè)敿?xì)闡述這兩個(gè)方法。

3.1 report 方法

report 方法用于記錄異常并將其發(fā)送給外部服務(wù)如 Bugsnag。默認(rèn)情況下,report方法只是將異常傳遞給異常被記錄的基類(lèi),你可以隨心所欲的記錄異常。

例如,如果你需要以不同方式報(bào)告不同類(lèi)型的異常,可使用 PHPinstanceof比較操作符:

/**
 * 報(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);
}

3.1.1 通過(guò)類(lèi)型忽略異常

異常處理器的$dontReport 屬性包含一個(gè)不會(huì)被記錄的異常類(lèi)型數(shù)組,默認(rèn)情況下,404 錯(cuò)誤異常不會(huì)被寫(xiě)到日志文件,如果需要的話你可以添加其他異常類(lèi)型到這個(gè)數(shù)組。

3.2 render 方法

render 方法負(fù)責(zé)將給定異常轉(zhuǎn)化為發(fā)送給瀏覽器的 HTTP響應(yīng),默認(rèn)情況下,異常被傳遞給為你生成響應(yīng)的基類(lèi)。然而,你可以隨心所欲地檢查異常類(lèi)型或者返回自定義響應(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 異常

有些異常描述來(lái)自服務(wù)器的 HTTP錯(cuò)誤碼,例如,這可能是一個(gè)“頁(yè)面未找到”錯(cuò)誤(404),“認(rèn)證失敗錯(cuò)誤”(401)亦或是程序出錯(cuò)造成的 500 錯(cuò)誤,為了在應(yīng)用中生成這樣的響應(yīng),使用如下方法:

abort(404);

abort 方法會(huì)立即引發(fā)一個(gè)會(huì)被異常處理器渲染的異常,此外,你還可以像這樣提供響應(yīng)描述:

abort(403, 'Unauthorized action.');

該方法可在請(qǐng)求生命周期的任何時(shí)間點(diǎn)使用。

4.1 自定義 HTTP 錯(cuò)誤頁(yè)面

Laravel 使得返回多種 HTTP狀態(tài)碼的錯(cuò)誤頁(yè)面變得簡(jiǎn)單,例如,如果你想要自定義 404 錯(cuò)誤頁(yè)面,創(chuàng)建一個(gè) resources/views/errors/404.blade.php文件,給文件將會(huì)渲染程序生成的所有 404 錯(cuò)誤。 改目錄下的視圖命名應(yīng)該和相應(yīng)的 HTTP 狀態(tài)碼相匹配。

5、日志

Laravel 日志工具基于強(qiáng)大的 Monolog庫(kù),默認(rèn)情況下,Laravel 被配置為在 storage/logs目錄下每日為應(yīng)用生成日志文件,你可以使用 Log門(mén)面編寫(xiě)日志信息到日志中:

<?php

namespace App\Http\Controllers;

use Log;
use App\User;
use App\Http\Controllers\Controller;

class UserController extends Controller{
    /**
     * 顯示指定用戶(hù)的屬性
     *
     * @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, infodebug。

Log::emergency($error);
Log::alert($error);
Log::critical($error);
Log::error($error);
Log::warning($error);
Log::notice($error);
Log::info($error);
Log::debug($error);

5.1 上下文信息

上下文數(shù)據(jù)數(shù)組也會(huì)被傳遞給日志方法。上下文數(shù)據(jù)將會(huì)和日志消息一起被格式化和顯示:

Log::info('User failed to login.', ['id' => $user->id]);

5.2 訪問(wèn)底層 Monolog 實(shí)例

Monolog 有多個(gè)可用于日志的處理器,如果需要的話,你可以訪問(wèn)底層 Monolog 實(shí)例:

$monolog = Log::getMonolog();
上一篇:加密下一篇:HTTP 響應(yīng)