Skip to content
虚位以待
虚位以待
赞助商
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待

错误与日志记录

介绍

当你开始一个新的 Laravel 项目时,错误和异常处理已经为你配置好了。此外,Laravel 集成了 Monolog 日志库,它提供了对多种强大日志处理器的支持。

配置

错误详情

应用程序通过浏览器显示的错误详情量由 config/app.php 配置文件中的 debug 配置选项控制。默认情况下,该配置选项设置为遵循存储在 .env 文件中的 APP_DEBUG 环境变量。

对于本地开发,你应该将 APP_DEBUG 环境变量设置为 true。在生产环境中,该值应始终为 false

日志模式

Laravel 开箱即支持 singledailysyslogerrorlog 日志模式。例如,如果你希望使用每日日志文件而不是单个文件,只需在 config/app.php 配置文件中设置 log 值:

php
'log' => 'daily'

自定义 Monolog 配置

如果你希望完全控制 Monolog 在应用程序中的配置,可以使用应用程序的 configureMonologUsing 方法。你应该在 bootstrap/app.php 文件中 $app 变量返回之前调用此方法:

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

return $app;

异常处理器

所有异常都由 App\Exceptions\Handler 类处理。该类包含两个方法:reportrender。我们将详细检查这两个方法。

报告方法

report 方法用于记录异常或将其发送到外部服务,如 BugSnag。默认情况下,report 方法只是将异常传递给基类,在那里记录异常。然而,你可以自由地以任何你希望的方式记录异常。

例如,如果你需要以不同的方式报告不同类型的异常,可以使用 PHP 的 instanceof 比较运算符:

php
/**
 * 报告或记录异常。
 *
 * 这是一个将异常发送到 Sentry、Bugsnag 等的好地方。
 *
 * @param  \Exception  $e
 * @return void
 */
public function report(Exception $e)
{
    if ($e instanceof CustomException) {
        //
    }

    return parent::report($e);
}

按类型忽略异常

异常处理器的 $dontReport 属性包含一个异常类型数组,这些类型的异常将不会被记录。默认情况下,由 404 错误导致的异常不会写入日志文件。你可以根据需要将其他异常类型添加到此数组中。

渲染方法

render 方法负责将给定异常转换为应发送回浏览器的 HTTP 响应。默认情况下,异常被传递给基类,基类为你生成响应。然而,你可以自由地检查异常类型或返回你自己的自定义响应:

php
/**
 * 将异常渲染为 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);
}

HTTP 异常

某些异常描述来自服务器的 HTTP 错误代码。例如,这可能是一个 "页面未找到" 错误 (404)、一个 "未授权错误" (401) 或者甚至是开发人员生成的 500 错误。为了从应用程序的任何地方生成这样的响应,请使用以下方法:

php
abort(404);

abort 方法将立即引发一个异常,该异常将由异常处理器渲染。可选地,你可以提供响应文本:

php
abort(403, 'Unauthorized action.');

此方法可以在请求生命周期的任何时候使用。

自定义 HTTP 错误页面

Laravel 使得为各种 HTTP 状态代码返回自定义错误页面变得容易。例如,如果你希望自定义 404 HTTP 状态代码的错误页面,请创建一个 resources/views/errors/404.blade.php。此文件将在应用程序生成的所有 404 错误时提供。

此目录中的视图应命名为与它们对应的 HTTP 状态代码相匹配。

日志记录

Laravel 的日志记录功能在强大的 Monolog 库之上提供了一个简单的层。默认情况下,Laravel 被配置为为你的应用程序创建每日日志文件,这些文件存储在 storage/logs 目录中。你可以使用 Log facade 将信息写入日志:

php
<?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 中定义的八个日志级别:emergencyalertcriticalerrorwarningnoticeinfodebug

php
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
Log::info('User failed to login.', ['id' => $user->id]);

访问底层 Monolog 实例

Monolog 有多种额外的处理器可用于日志记录。如果需要,你可以访问 Laravel 使用的底层 Monolog 实例:

php
$monolog = Log::getMonolog();