错误与日志
错误 & 日志
简介
当你开始一个新的 Lumen 项目时,Lumen 已经为你配置好了错误和异常处理操作。另外 Lumen 集成了 Monolog 日志函数库,Monolog 支持和提供了多种强大的日志处理功能。
配置
错误细节
你的应用程序通过 .env
配置文件中的 APP_DEBUG
设置选项来控制浏览器对应用出错信细节的显示。
在开发时,你应该将环境变量 APP_DEBUG
设置为 true
。在生产环境中,这个值应该永远是 false
。
自定义 Monolog 配置
如果你想完全控制 Monolog,你可以使用应用中 configureMonologUsing
方法。这个方法应该在 bootstrap/app.php
文件返回 $app
之前被调用:
$app->configureMonologUsing(function($monolog) {
$monolog->pushHandler(...);
return $monolog;
});
return $app;
异常处理
所有的异常都是由 App\Exceptions\Handler
处理。这个类包含 report
和 render
两个方法。我们将继续研究这两个方法的细节。
Report 方法
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 方法
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('Custom Message');
}
return parent::render($request, $e);
}
HTTP 异常
有些异常适用于描述来自于服务器的 HTTP 错误码。例如:这可能是个「找不到页面」错误(404),「未受权限」错误(401),或甚至是开发者导致 500 错误。你可以使用以下方法在应用程序的任何地方生成响应:
abort(404);
abort
方法通过错误处理将会立即引发异常,并且呈现错误。或者你也可以提供响应的文本消息:
abort(403, 'Unauthorized action.');
你可以在请求的生命周期中任何时间点使用这个方法。
Logging
Lumen 日志工具在强大的 Monolog 函数库上提供了多一层简单的功能。Lumen 默认为应用程序创建每日的日志文件并保存在 storage/logs
目录中。你可以使用 Log
facade 将信息写入日志:
<?php
namespace App\Http\Controllers;
use Log;
use App\User;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 显示指定 ID 用户信息。
*
* @param int $id
* @return Response
*/
public function show($id)
{
Log::info('Showing user: '.$id);
return User::findOrFail($id);
}
}
注意: 使用
Log
facade之前,请确保在bootstrap/app.php
文件中取消调用$app->withFacades()
方法的注释。
日志工具提供了定义在 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]);
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。