错误与日志记录
介绍
当你开始一个新的 Laravel 项目时,错误和异常处理已经为你配置好了。此外,Laravel 集成了 Monolog 日志库,它提供了对多种强大日志处理器的支持。
配置
错误详情
应用程序通过浏览器显示的错误详情量由 config/app.php
配置文件中的 debug
配置选项控制。默认情况下,该配置选项设置为遵循存储在 .env
文件中的 APP_DEBUG
环境变量。
对于本地开发,你应该将 APP_DEBUG
环境变量设置为 true
。在生产环境中,该值应始终为 false
。
日志模式
Laravel 开箱即支持 single
、daily
、syslog
和 errorlog
日志模式。例如,如果你希望使用每日日志文件而不是单个文件,只需在 config/app.php
配置文件中设置 log
值:
'log' => 'daily'
自定义 Monolog 配置
如果你希望完全控制 Monolog 在应用程序中的配置,可以使用应用程序的 configureMonologUsing
方法。你应该在 bootstrap/app.php
文件中 $app
变量返回之前调用此方法:
$app->configureMonologUsing(function($monolog) {
$monolog->pushHandler(...);
});
return $app;
异常处理器
所有异常都由 App\Exceptions\Handler
类处理。该类包含两个方法:report
和 render
。我们将详细检查这两个方法。
报告方法
report
方法用于记录异常或将其发送到外部服务,如 BugSnag。默认情况下,report
方法只是将异常传递给基类,在那里记录异常。然而,你可以自由地以任何你希望的方式记录异常。
例如,如果你需要以不同的方式报告不同类型的异常,可以使用 PHP 的 instanceof
比较运算符:
/**
* 报告或记录异常。
*
* 这是一个将异常发送到 Sentry、Bugsnag 等的好地方。
*
* @param \Exception $e
* @return void
*/
public function report(Exception $e)
{
if ($e instanceof CustomException) {
//
}
return parent::report($e);
}
按类型忽略异常
异常处理器的 $dontReport
属性包含一个异常类型数组,这些类型的异常将不会被记录。默认情况下,由 404 错误导致的异常不会写入日志文件。你可以根据需要将其他异常类型添加到此数组中。
渲染方法
render
方法负责将给定异常转换为应发送回浏览器的 HTTP 响应。默认情况下,异常被传递给基类,基类为你生成响应。然而,你可以自由地检查异常类型或返回你自己的自定义响应:
/**
* 将异常渲染为 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 错误。为了从应用程序的任何地方生成这样的响应,请使用以下方法:
abort(404);
abort
方法将立即引发一个异常,该异常将由异常处理器渲染。可选地,你可以提供响应文本:
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
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 中定义的八个日志级别: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);
上下文信息
一个上下文数据数组也可以传递给日志方法。此上下文数据将与日志消息一起格式化和显示:
Log::info('User failed to login.', ['id' => $user->id]);
访问底层 Monolog 实例
Monolog 有多种额外的处理器可用于日志记录。如果需要,你可以访问 Laravel 使用的底层 Monolog 实例:
$monolog = Log::getMonolog();