错误与日志
配置
您应用程序的日志处理程序在 app/start/global.php
启动文件 中注册。默认情况下,记录器配置为使用单个日志文件;但是,您可以根据需要自定义此行为。由于 Laravel 使用流行的 Monolog 日志库,您可以利用 Monolog 提供的各种处理程序。
例如,如果您希望使用每日日志文件而不是单个大型文件,可以在启动文件中进行以下更改:
$logFile = 'laravel.log';
Log::useDailyFiles(storage_path().'/logs/'.$logFile);
错误详细信息
默认情况下,您的应用程序启用了错误详细信息。这意味着当发生错误时,您将看到带有详细堆栈跟踪和错误消息的错误页面。您可以通过将 app/config/app.php
文件中的 debug
选项设置为 false
来关闭错误详细信息。
强烈建议您在生产环境中关闭错误详细信息。
处理错误
默认情况下,app/start/global.php
文件包含一个处理所有异常的错误处理程序:
App::error(function(Exception $exception)
{
Log::error($exception);
});
这是最基本的错误处理程序。但是,您可以根据需要指定更多处理程序。处理程序根据它们处理的异常的类型提示进行调用。例如,您可以创建一个仅处理 RuntimeException
实例的处理程序:
App::error(function(RuntimeException $exception)
{
// 处理异常...
});
如果异常处理程序返回响应,则该响应将发送到浏览器,其他错误处理程序将不再被调用:
App::error(function(InvalidUserException $exception)
{
Log::error($exception);
return '抱歉!此账户出现问题!';
});
要监听 PHP 致命错误,您可以使用 App::fatal
方法:
App::fatal(function($exception)
{
//
});
如果您有多个异常处理程序,它们应该从最通用到最具体进行定义。因此,例如,处理所有 Exception
类型的处理程序应该在处理自定义异常类型(如 Illuminate\Encryption\DecryptException
)之前定义。
放置错误处理程序的位置
没有默认的“家”用于错误处理程序注册。Laravel 在这方面为您提供了自由。一个选项是在 start/global.php
文件中定义处理程序。通常,这是放置任何“引导”代码的方便位置。如果该文件变得拥挤,您可以创建一个 app/errors.php
文件,并从 start/global.php
脚本中 require
该文件。第三个选项是创建一个 服务提供者 来注册处理程序。同样,没有单一的“正确”答案。选择一个您感到舒适的位置。
HTTP 异常
一些异常描述来自服务器的 HTTP 错误代码。例如,这可能是“页面未找到”错误(404)、“未经授权错误”(401)或甚至是开发人员生成的 500 错误。为了返回这样的响应,请使用以下代码:
App::abort(404);
可选地,您可以提供一个响应:
App::abort(403, '未经授权的操作。');
此方法可以在请求的生命周期中的任何时间使用。
处理 404 错误
您可以注册一个错误处理程序来处理应用程序中的所有“404 未找到”错误,从而轻松返回自定义的 404 错误页面:
App::missing(function($exception)
{
return Response::view('errors.missing', array(), 404);
});
日志记录
Laravel 日志设施在强大的 Monolog 库之上提供了一个简单的层。默认情况下,Laravel 配置为为您的应用程序创建一个单一的日志文件,该文件存储在 app/storage/logs/laravel.log
中。您可以像这样向日志中写入信息:
Log::info('这是一条有用的信息。');
Log::warning('某些事情可能出现问题。');
Log::error('某些事情真的出现了问题。');
记录器提供了在 RFC 5424 中定义的七个日志级别:debug、info、notice、warning、error、critical 和 alert。
还可以将上下文数据数组传递给日志方法:
Log::info('日志消息', array('context' => '其他有用的信息'));
Monolog 还有多种附加处理程序可供您用于日志记录。如果需要,您可以访问 Laravel 使用的底层 Monolog 实例:
$monolog = Log::getMonolog();
您还可以注册一个事件来捕获传递给日志的所有消息:
注册日志监听器
Log::listen(function($level, $message, $context)
{
//
});