Laravel5.1-错误和日志
简介
这一章也是属于文档写得比较混乱的一章,所以我决定重新组织一下内容结构;
配置
debug配置
我们都知道,开发环境应该把debug打开,生产环境应该把debug关闭;
这个设置在config/app.php文件里,找到这一项:
'debug' => env('APP_DEBUG', false),
优先配置.env的值,后面是默认值。 true把debug打开,false关闭;
log模式配置
同样在config/app.php文件里,找到:
'log' => 'single',
这里一个有4个可用选项值:"single", "daily", "syslog", "errorlog", 他们分别是:
- 单文件日志;
- 每日一文件日志;
- 系统日志;
- 错误日志;
处理错误对象及报错信息
看app\Exceptions\handler.php这个文件,这是处理所有错误信息的关键文件:
namespace App\Exceptions;use Exception;use Symfony\Component\HttpKernel\Exception\HttpException;use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;class Handler extends ExceptionHandler{protected $dontReport = [HttpException::class,];public function report(Exception $e){return parent::report($e);}public function render($request, Exception $e){return parent::render($request, $e);}}
一个属性,2个方法;
$dontReport
先来看$dontReport属性,意思是不要log的错误信息,这里面填了HttpException::class, 也就是说,404这种错误, 如果你在这里设置HttpException,laravel会触发,但不会记录的。
你还可以添加更多不报告的错误类;
report()
这个只是把错误对象传递一下,传到基类ExceptionHandler中去,你也可以在这里面把错误类型发布到一些外部服务。
不明白什么意思就跳过,这里不常用;
render()
render()是渲染错误视图的地方,我们主要的自定义逻辑写在这里;
我们最常见的错误类型可能就是:
ModelNotFoundException

于是我们可以这样写:
public function render($request, Exception $e){switch($e){case ($e instanceof ModelNotFoundException):return response()->view('errors.404', [], 404);breakdefault:return parent::render($request, $e);}}
这样遇到这个ModelNotFoundException错误类的时候,就会触发'errors.404'这个视图;
自定义错误类
首先,在app\Exceptions\里建立一个自定义类:
namespace App\Exceptions;class CustomException extends \Exception{}
然后,在handler.php 的handler()方法内,判断并处理CustomException,显示相应的视图;
public function render($request, Exception $e){switch($e){case ($e instanceof ModelNotFoundException):return response()->view('errors.404', [], 404);breakcase ($e instanceof CustomException):return response()->view('errors.custom',['exception'=>$e]);breakdefault:return parent::render($request, $e);}}
触发自定义错误类
try{App\User::find(-1);}catch(){throw new App\Exceptions\CustomException;}
错误视图常用的一些显示错误的方法
@extends('template.master')@section('content')<h1>@{{ $exception->getStatusCode() }}</h1><p>@if(!empty($exception->getMessage()))@{{ $exception->getMessage() }}@else@{{ \Symfony\Component\HttpFoundation\Response::$statusTexts[$exception->getStatusCode()] }}@endif</p>@endsection
HTTP错误
自定义http错误页面
发生http错误时,系统会先在resources/views/errors/这个文件夹内找与http错误代码同名的blade文件,比如400错误就会找resources/views/errors/404.blade.php, 所以自定义http错误显示页面,只要在resources/views/errors/按照http错误代码号建立对应的blade文件就行了。
抛出http错误代码
一般,服务器上会设置什么时候抛出http错误代码,但你也可以手动抛出,方法是:
abort(401); abort(500);abort(403)
填上对应的错误代码号即可,这个方法在request的整个生命周期内都可用;
Logging
Laravel的日志功能基于强大的 Monolog 类库,默认情况下是每天生成一个日志文件的模式,日子文件存储在storage/logs;
插入log信息
你可以在代码中向log日志插入信息,一共有这些方法可以使用:
Log::emergency($error);Log::alert($error);Log::critical($error);Log::error($error);Log::warning($error);Log::notice($error);Log::info($error);Log::debug($error);
代码示例:
public function showProfile($id){Log::info('Showing user profile for user: '.$id);return view('user.profile', ['user' => User::findOrFail($id)]);}
上下文信息
Log::info('User failed to login.', ['id' => $user->id]);
你可以像这样插入第二个参数,数组内的信息将会被格式化,在log显示出来;
获取Monolog对象
$monolog = Log::getMonolog();
像这样获取Monolog对象,Monolog对象中有很多方法可以操作log信息。

浙公网安备 33010602011771号