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'

使用 daily 日志模式时,Laravel 默认只保留五天的日志文件。如果你想调整保留文件的数量,可以在 app.php 配置文件中添加一个可选的 log_max_files 配置值:

php
'log_max_files' => 30

自定义 Monolog 配置

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

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

return $app;

默认情况下,Laravel 会写入所有日志级别。在生产环境中,你可能希望通过在 app.php 配置文件中添加 log_level 选项来配置默认日志级别。Laravel 将记录所有大于或等于指定严重级别的日志。例如,默认 log_levelerror 将记录 errorcriticalalertemergency 消息:

php
'log_level' => env('APP_LOG_LEVEL', 'debug'),

异常处理器

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

报告方法

report 方法用于记录异常或将其发送到外部服务,如 BugSnagSentry。默认情况下,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 错误时提供。

由 abort 方法引发的异常将作为 $exception 传递给视图,这允许你在需要时向用户展示错误消息。例如:

php
$exception->getMessage()

此目录中的视图应命名为与它们对应的 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();