• Laravel5.1-错误和日志


    简介

    这一章也是属于文档写得比较混乱的一章,所以我决定重新组织一下内容结构;

    配置

    debug配置

    我们都知道,开发环境应该把debug打开,生产环境应该把debug关闭;
    这个设置在config/app.php文件里,找到这一项:

    1. 'debug' => env('APP_DEBUG', false),

    优先配置.env的值,后面是默认值。 true把debug打开,false关闭;

    log模式配置

    同样在config/app.php文件里,找到:

    1. 'log' => 'single',

    这里一个有4个可用选项值:"single", "daily", "syslog", "errorlog", 他们分别是:

    • 单文件日志;
    • 每日一文件日志;
    • 系统日志;
    • 错误日志;

    处理错误对象及报错信息

    appExceptionshandler.php这个文件,这是处理所有错误信息的关键文件:

    1. namespace AppExceptions;
    2. use Exception;
    3. use SymfonyComponentHttpKernelExceptionHttpException;
    4. use IlluminateFoundationExceptionsHandler as ExceptionHandler;
    5. class Handler extends ExceptionHandler
    6. {
    7. protected $dontReport = [
    8. HttpException::class,
    9. ];
    10. public function report(Exception $e)
    11. {
    12. return parent::report($e);
    13. }
    14. public function render($request, Exception $e)
    15. {
    16. return parent::render($request, $e);
    17. }
    18. }

    一个属性,2个方法;

    $dontReport

    先来看$dontReport属性,意思是不要log的错误信息,这里面填了HttpException::class, 也就是说,404这种错误, 如果你在这里设置HttpException,laravel会触发,但不会记录的。

    你还可以添加更多不报告的错误类;

    report()

    这个只是把错误对象传递一下,传到基类ExceptionHandler中去,你也可以在这里面把错误类型发布到一些外部服务。

    不明白什么意思就跳过,这里不常用;

    render()

    render()是渲染错误视图的地方,我们主要的自定义逻辑写在这里;

    我们最常见的错误类型可能就是:

    1. ModelNotFoundException

    error.jpg

    于是我们可以这样写:

    1. public function render($request, Exception $e)
    2. {
    3. switch($e){
    4. case ($e instanceof ModelNotFoundException):
    5. return response()->view('errors.404', [], 404);
    6. break
    7. default:
    8. return parent::render($request, $e);
    9. }
    10. }

    这样遇到这个ModelNotFoundException错误类的时候,就会触发'errors.404'这个视图;

    自定义错误类

    首先,在appExceptions里建立一个自定义类:

    1. namespace AppExceptions;
    2. class CustomException extends Exception
    3. {
    4. }

    然后,在handler.php 的handler()方法内,判断并处理CustomException,显示相应的视图;

    1. public function render($request, Exception $e)
    2. {
    3. switch($e){
    4. case ($e instanceof ModelNotFoundException):
    5. return response()->view('errors.404', [], 404);
    6. break
    7. case ($e instanceof CustomException):
    8. return response()->view('errors.custom',['exception'=>$e]);
    9. break
    10. default:
    11. return parent::render($request, $e);
    12. }
    13. }

    触发自定义错误类

    1. try{
    2. AppUser::find(-1);
    3. }catch(){
    4. throw new AppExceptionsCustomException;
    5. }

    错误视图常用的一些显示错误的方法

    1. @extends('template.master')
    2. @section('content')
    3. <h1>
    4. @{{ $exception->getStatusCode() }}
    5. </h1>
    6. <p>
    7. @if(!empty($exception->getMessage()))
    8. @{{ $exception->getMessage() }}
    9. @else
    10. @{{ SymfonyComponentHttpFoundationResponse::$statusTexts[$exception->getStatusCode()] }}
    11. @endif
    12. </p>
    13. @endsection

    HTTP错误

    自定义http错误页面

    发生http错误时,系统会先在resources/views/errors/这个文件夹内找与http错误代码同名的blade文件,比如400错误就会找resources/views/errors/404.blade.php, 所以自定义http错误显示页面,只要在resources/views/errors/按照http错误代码号建立对应的blade文件就行了。

    抛出http错误代码

    一般,服务器上会设置什么时候抛出http错误代码,但你也可以手动抛出,方法是:

    1. abort(401); abort(500);abort(403)

    填上对应的错误代码号即可,这个方法在request的整个生命周期内都可用;

    Logging

    Laravel的日志功能基于强大的 Monolog 类库,默认情况下是每天生成一个日志文件的模式,日子文件存储在storage/logs

    插入log信息

    你可以在代码中向log日志插入信息,一共有这些方法可以使用:

    1. Log::emergency($error);
    2. Log::alert($error);
    3. Log::critical($error);
    4. Log::error($error);
    5. Log::warning($error);
    6. Log::notice($error);
    7. Log::info($error);
    8. Log::debug($error);

    代码示例:

    1. public function showProfile($id)
    2. {
    3. Log::info('Showing user profile for user: '.$id);
    4. return view('user.profile', ['user' => User::findOrFail($id)]);
    5. }

    上下文信息

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

    你可以像这样插入第二个参数,数组内的信息将会被格式化,在log显示出来;

    获取Monolog对象

    1. $monolog = Log::getMonolog();

    像这样获取Monolog对象,Monolog对象中有很多方法可以操作log信息。

  • 相关阅读:
    jQuery 插件
    jQuery 构造函数
    jQuery.merge()方法
    插入排序法
    归并排序法
    冒泡排序法
    选择排序法
    Jetty
    分布式锁&&redis
    Tomcat和设计模式
  • 原文地址:https://www.cnblogs.com/isykw/p/6151558.html
Copyright © 2020-2023  润新知