错误与日志

配置

应用程序的日志功能配置在 Illuminate\Foundation\Bootstrap\ConfigureLogging 启动类中。这个类使用 config/app.php 配置文件的 log 配置选项。

日志工具默认使用每天的日志文件;然而,你可以依照需求自定义这个行为。因为 Laravel 使用流行的 Monolog 日志函数库,你可以利用很多 Monolog 提供的处理进程。

例如,如果你想要使用单一日志文件,而不是每天一个日志文件,你可以对 config/app.php 配置文件做下面的变更:

'log' => 'single'

Laravel 提供立即可用的 singledailysyslogerrorlog 日志模式。然而,你可以通过覆写 ConfigureLogging 启动类,依照需求自由地自定义应用程序的日志。

错误细节

config/app.php 配置文件的 app.debug 配置选项控制应用程序透过浏览器显示错误细节。配置选项默认参照 .env 文件的 APP_DEBUG 环境变量。

进行本地开发时,你应该配置 APP_DEBUG 环境变量为 true在上线环境,这个值应该永远为 false

错误处理

所有的异常都由 App\Exceptions\Handler 类处理。这个类包含两个方法: reportrender

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

render 方法负责把异常转换成应该被传递回浏览器的 HTTP 响应。默认情况下,异常会被传递到基础类并帮你产生响应。然而,你可以自由的检查异常类型或返回自定义的响应。

异常处理进程的 dontReport 属性是个数组,包含应该不要被纪录的异常类型。由 404 错误导致的异常默认不会被写到日志文件。你可以依照需求添加其他类型的异常到这个数组。

HTTP 异常

有一些异常是描述来自服务器的 HTTP 错误码。例如,这可能是个「找不到页面」错误 (404)、「未授权错误」(401),或甚至是工程师导致的 500 错误。使用下面的方法来返回这样一个响应:

abort(404);

或是你可以选择提供一个响应:

abort(403, 'Unauthorized action.');

你可以在请求的生命周期中任何时间点使用这个方法。

自定义 404 错误页面

要让所有的 404 错误返回自定义的视图,请建立一个 resources/views/errors/404.blade.php 文件。应用程序将会使用这个视图处理所有发生的 404 错误。

日志

Laravel 日志工具在强大的 Monolog 函数库上提供一层简单的功能。Laravel 默认为应用程序建立每天的日志文件在 storage/logs 目录。你可以像这样把信息写到日志:

Log::info('This is some useful information.');

Log::warning('Something could be going wrong.');

Log::error('Something is really going wrong.');

日志工具提供定义在 RFC 5424 的七个级别:debuginfonoticewarningerrorcriticalalert

也可以传入上下文相关的数据数组到日志方法里:

Log::info('Log message', ['context' => 'Other helpful information']);

Monolog 有很多其他的处理方法可以用在日志上。如有需要,你可以取用 Laravel 底层使用的 Monolog 实例:

$monolog = Log::getMonolog();

你也可以注册事件来捕捉所有传到日志的消息:

注册日志事件监听器

Log::listen(function($level, $message, $context)
{
    //
});