当启动新项目时,错误和异常处理已经配置好了。另外,Laravel跟Monolog这个日志库集成的,这个库提供了大量的功能强大的log处理器。
应用通过浏览器显示的错误细节的数量是通过在config/app.php
中的debug
配置项控制的。默认情况下,这个配置项是遵从APP_DEBUG
环境变量的,环境变量保存在.env
文件中。
对于开发者,应该将APP_DEBUG
设置为true
,在生产环境,应该设置为false
。
不需要经过配置,Laravel支持signle
, daily
, syslog
, errorlog
等几种日志模式。例如,如果需要使用daily日志文件取代single日志文件,只需要将config\app.php
配置文件中的log
设置一下就可以。
`log` => 'daily',
可以通过使用应用的configureMonologUsing
方法来对Monolog进行完全的控制。在bootstrap/app.php
文件中的$app
返回之前,调用这个方法即可。
$app->configureMonologUsing(function($monolog) {
$monolog->pushHandler(...);
});
所有的异常都是被App\Exception\Handler
类来处理的,这个类包含两个方法:report
和renderMethod
。
report
方法用来记录异常,并将异常发送到外部服务,例如BugSnag
。默认情况下,report
方法只是简单的将异常传递给记录异常的基础的类。然而,我们可以依据自己的想法来记录所有的异常。
例如,如果需要对各种exception单独处理,可以使用PHP的instanceof
操作符。
/** * Report or log an exception. * * This is a great spot to send exceptions to Sentry, Bugsnag, etc. * * @param \Exception $e * @return void */
public function report(Exception $e) {
if ($e instanceof CustomException) {
//
}
return parent::report($e);
}
Handler类的$dontReport
属性用来记录不需要记录日志的异常类型。默认情况下,404错误的异常不会被记录到log文件中。可以按需添加任何的exception到这个数组中。
render
方法是用来将一个给定的exception转化为一个HTTP响应,并将这个响应返回到浏览器。默认情况下,异常传送给生成响应的一个基类,但是,你也可以根据异常类型不同返回定制的响应。
/** * Render an exception into an HTTP response. * * @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错误码,例如,404(page not found),401(unauthorized error)甚至500错误。为了在应用中的任何地方都能生成这样的响应,利用如下代码:
abort(404);
abort
方法会立刻生成一个异常,并被异常处理器的render方法处理。可以提供响应的文字:
abort(403, 'Unauthorized action.');
这个方法可以在request的生命周期的任何时候调用。
使用Laravel,可以很容易的对不同的HTTP状态码生成不同的错误页。例如,如果想自定义404页面,创建文件resources\views\errors\404.blade.php
,这个页面会被应用产生的所有404错误使用。
在这个目录中的视图,需要被命名为匹配HTTP状态码。
Laravel的日志记录功能提供了基于功能强大Monolog的简单的封装。默认情况下,laravel创建每日log,并保存在storage/logs
目录下。可以使用Log
外观模式来写入log。
namespace App\Http\Controllers;
use Log;
use App\User;
use App\Http\Controllers\Controller;
class UserController extends Controller {
/** * Show the profile for the given user. * * @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)]);
}
}
log提供了RFC5424中定义的八种log等级。emergency, alert, critical, error, warning, notice, info, dubug
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方法,这些上下文数据会被格式化后显示在log信息中
Log::info('User failed to login.', ['id' => $user->id]);
Monolog提供了大量的处理器老记录log。使用如下方式获取实例。
$monolog = Log::getMonolog();