错误与日志

未匹配的标注
本文档最新版为 6.x,旧版本可能放弃维护,推荐阅读最新版!

错误 & 日志

简介

当你开始一个新的 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 处理。这个类包含 reportrender 两个方法。我们将继续研究这两个方法的细节。

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 的八个级别: emergencyalertcriticalerrorwarningnoticeinfodebug

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

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/lumen/5.5/error...

译文地址:https://learnku.com/docs/lumen/5.5/error...

上一篇 下一篇
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
贡献者:5
讨论数量: 0
发起讨论 只看当前版本


暂无话题~