错误与日志

配置文件

日志处理程序注册在启动文件 app/start/global.php 文件里面。日志都默认储存在一个单独的文件中,您可以依照实际需求自定义日志。因为 Laravel 使用了非常流行的 Monolog 日志库,您可以利用 Monolog 提供的多种方式管理你的日志。

例如,如果您想每天使用一个文件记录日志而不是使用单独的庞大文件,您可以照着下面的例子更改开始配置文件:

$logFile = 'laravel.log';

Log::useDailyFiles(storage_path().'/logs/'.$logFile);

错误显示

错误显示默认为开启,意味着当错误发生时,将有错误页面显示详细的调用追踪和错误信息。您可以关掉错误显示的选项,把app/config/app.php里的debug选项改成false

注意:强烈建议在生产环境中关掉错误显示。

错误处理

app/start/global.php里默认有一个处理所有异常的异常处理程序:

App::error(function(Exception $exception)
{
    Log::error($exception);
});

这是最基本的异常处理程序,然而您可以依照需求设定更多异常处理程序。异常处理程序会依照异常的类型提示( type-hint )被调用。例如,您可以创造一个只处理RuntimeException的异常处理程序:

App::error(function(RuntimeException $exception)
{
    // Handle the exception...
});

如果异常处理程序回传一个 response,response 会直接回传到浏览器,而其他异常处理程序将不会被调用:

App::error(function(InvalidUserException $exception)
{
    Log::error($exception);

    return 'Sorry! Something is wrong with this account!';
});

为了监听 PHP fetal errors,您可以利用App::fatal方法:

App::fatal(function($exception)
{
    //
});

如果您有很多异常处理程序,他们应该依照从最通用到最特定的顺序被定义。例如,一个对应处理类型为Exception的异常处理程序,应该被定义在一个对应处理自定义异常类型,如Illuminate\Encryption\DecryptException的异常处理程序之前。

何处定义异常处理程序

默认上没有注册异常处理程序的地方。Laravel 可以让您自由设定。选择之一是定义程序在 start/global.php中,一般来说,这是一个让您方便写入任何"bootstrapping" 代码的地方。如果文件变得很拥挤,可以建立一个 app/errors.php文件,并且在start/global.php中引入。第三个选择是建立 service provider 以注册程序。再一次强调,这个问题并没有正确的答案,您直接选择一个让您觉得舒适的地方注册异常处理程序即可。

HTTP 异常处理

一些异常处理表示来自服务器的 HTTP 错误码,例如可能是「找不到页面」错误(404),未授权错误(401),或甚至是工程师导致的500错误。使用下列方法以回传这些回应:

App::abort(404);

或是您可以选择提供一个回应:

App::abort(403, 'Unauthorized action.');

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

404错误处理

您可以注册一个错误处理程序处理所有"404 Not Found"错误,让您可以简单的回传自定义的404错误页面。

App::missing(function($exception)
{
    return Response::view('errors.missing', array(), 404);
});

日志

Laravel 提供一个建立在强大的 Monolog 上的日志工具。Laravel 默认设定在应用程序里建立单一日志文件,这个文件储存在app/storage/logs/laravel.log。 您可以像下面这样写入信息:

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

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

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

日志工具提供了七种定义在 RFC 5424 的级别:debug, info, notice, warning, error, critical, and alert

可以在传入上下文相关的数组到 log 的方法里:

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

Monolog 提供很多额外的方法可以记录。若有需要,您可以使用 Laravel 里使用的 Monolog 实例:

$monolog = Log::getMonolog();

您可以注册事件捕捉所有传到日志的信息:

注册日志监听程序

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