Skip to content

错误与日志

配置

您应用程序的日志处理程序在 app/start/global.php 启动文件 中注册。默认情况下,记录器配置为使用单个日志文件;但是,您可以根据需要自定义此行为。由于 Laravel 使用流行的 Monolog 日志库,您可以利用 Monolog 提供的各种处理程序。

例如,如果您希望使用每日日志文件而不是单个大型文件,可以在启动文件中进行以下更改:

php
$logFile = 'laravel.log';

Log::useDailyFiles(storage_path().'/logs/'.$logFile);

错误详细信息

默认情况下,您的应用程序启用了错误详细信息。这意味着当发生错误时,您将看到带有详细堆栈跟踪和错误消息的错误页面。您可以通过将 app/config/app.php 文件中的 debug 选项设置为 false 来关闭错误详细信息。

lightbulb

强烈建议您在生产环境中关闭错误详细信息。

处理错误

默认情况下,app/start/global.php 文件包含一个处理所有异常的错误处理程序:

php
App::error(function(Exception $exception)
{
	Log::error($exception);
});

这是最基本的错误处理程序。但是,您可以根据需要指定更多处理程序。处理程序根据它们处理的异常的类型提示进行调用。例如,您可以创建一个仅处理 RuntimeException 实例的处理程序:

php
App::error(function(RuntimeException $exception)
{
	// 处理异常...
});

如果异常处理程序返回响应,则该响应将发送到浏览器,其他错误处理程序将不再被调用:

php
App::error(function(InvalidUserException $exception)
{
	Log::error($exception);

	return '抱歉!此账户出现问题!';
});

要监听 PHP 致命错误,您可以使用 App::fatal 方法:

php
App::fatal(function($exception)
{
	//
});

如果您有多个异常处理程序,它们应该从最通用到最具体进行定义。因此,例如,处理所有 Exception 类型的处理程序应该在处理自定义异常类型(如 Illuminate\Encryption\DecryptException)之前定义。

放置错误处理程序的位置

没有默认的“家”用于错误处理程序注册。Laravel 在这方面为您提供了自由。一个选项是在 start/global.php 文件中定义处理程序。通常,这是放置任何“引导”代码的方便位置。如果该文件变得拥挤,您可以创建一个 app/errors.php 文件,并从 start/global.php 脚本中 require 该文件。第三个选项是创建一个 服务提供者 来注册处理程序。同样,没有单一的“正确”答案。选择一个您感到舒适的位置。

HTTP 异常

一些异常描述来自服务器的 HTTP 错误代码。例如,这可能是“页面未找到”错误(404)、“未经授权错误”(401)或甚至是开发人员生成的 500 错误。为了返回这样的响应,请使用以下代码:

php
App::abort(404);

可选地,您可以提供一个响应:

php
App::abort(403, '未经授权的操作。');

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

处理 404 错误

您可以注册一个错误处理程序来处理应用程序中的所有“404 未找到”错误,从而轻松返回自定义的 404 错误页面:

php
App::missing(function($exception)
{
	return Response::view('errors.missing', array(), 404);
});

日志记录

Laravel 日志设施在强大的 Monolog 库之上提供了一个简单的层。默认情况下,Laravel 配置为为您的应用程序创建一个单一的日志文件,该文件存储在 app/storage/logs/laravel.log 中。您可以像这样向日志中写入信息:

php
Log::info('这是一条有用的信息。');

Log::warning('某些事情可能出现问题。');

Log::error('某些事情真的出现了问题。');

记录器提供了在 RFC 5424 中定义的七个日志级别:debuginfonoticewarningerrorcriticalalert

还可以将上下文数据数组传递给日志方法:

php
Log::info('日志消息', array('context' => '其他有用的信息'));

Monolog 还有多种附加处理程序可供您用于日志记录。如果需要,您可以访问 Laravel 使用的底层 Monolog 实例:

php
$monolog = Log::getMonolog();

您还可以注册一个事件来捕获传递给日志的所有消息:

注册日志监听器

php
Log::listen(function($level, $message, $context)
{
	//
});