Errors & Logging

来源:互联网 发布:sql中的distinct 编辑:程序博客网 时间:2024/06/04 00:49

Errors & Logging

1. 介绍

当启动新项目时,错误和异常处理已经配置好了。另外,Laravel跟Monolog这个日志库集成的,这个库提供了大量的功能强大的log处理器。

2.配置

Error Detail

应用通过浏览器显示的错误细节的数量是通过在config/app.php中的debug配置项控制的。默认情况下,这个配置项是遵从APP_DEBUG环境变量的,环境变量保存在.env文件中。
对于开发者,应该将APP_DEBUG设置为true,在生产环境,应该设置为false

Log Modes

不需要经过配置,Laravel支持signle, daily, syslog, errorlog等几种日志模式。例如,如果需要使用daily日志文件取代single日志文件,只需要将config\app.php配置文件中的log设置一下就可以。

    `log` => 'daily',

Custom Monolog Configuration

可以通过使用应用的configureMonologUsing方法来对Monolog进行完全的控制。在bootstrap/app.php文件中的$app返回之前,调用这个方法即可。

    $app->configureMonologUsing(function($monolog) {        $monolog->pushHandler(...);});

3.异常处理

所有的异常都是被App\Exception\Handler类来处理的,这个类包含两个方法:reportrenderMethod

3.1 Report方法

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);}

忽略某些类型的exception

Handler类的$dontReport属性用来记录不需要记录日志的异常类型。默认情况下,404错误的异常不会被记录到log文件中。可以按需添加任何的exception到这个数组中。

3.2 Render方法

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);}

4.HTTP异常

一些异常描述了服务器端的HTTP错误码,例如,404(page not found),401(unauthorized error)甚至500错误。为了在应用中的任何地方都能生成这样的响应,利用如下代码:

    abort(404);

abort方法会立刻生成一个异常,并被异常处理器的render方法处理。可以提供响应的文字:

    abort(403, 'Unauthorized action.');

这个方法可以在request的生命周期的任何时候调用。

自定义HTTP错误页(Custom HTTP Error Pages)

使用Laravel,可以很容易的对不同的HTTP状态码生成不同的错误页。例如,如果想自定义404页面,创建文件resources\views\errors\404.blade.php,这个页面会被应用产生的所有404错误使用。
在这个目录中的视图,需要被命名为匹配HTTP状态码。

5.日志

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);

上下文信息(Contextual Information)

可以传递一个上下文相关的数据给log方法,这些上下文数据会被格式化后显示在log信息中

    Log::info('User failed to login.', ['id' => $user->id]);

访问底层的Monolog实例(Accessing the underlying Monolog Instance)

Monolog提供了大量的处理器老记录log。使用如下方式获取实例。

    $monolog = Log::getMonolog();
0 0
原创粉丝点击