简介

Laravel 项目里已经为你配置好了错误和异常处理。项目中的异常都是在 App\Exceptions\Handler 类中处理并渲染给用户的。接下来,我们将深入到该类中进行讲解。

Laravel 是利用了 Monolog 这个库记录日志的,这个库里包含了大量的日志处理方法。Laravel 为你配置了这些处理方法,提供了单个日志文件、每日一个日志文件和将错误信息写入系统日志这几个选项供你选择。

配置

错误内容

config/app.php 配置文件中的 debug 选项决定错误发生时,显示给用户看的内容是多啊还是少,是详细啊还是简略。默认,这个选项值优先使用 .env 文件里 APP_DEBUG 字段的设定值。

对于本地开发环境,把 APP_DEBUG 设定为 true,而在生产环境,应该总是设置为 false。如果在生产环境开启了 Debug 模式,项目中的一些敏感信息就会暴露给终端用户的,后果可能不堪设想。

日志存储

Laravel 开箱支持以下几种日志记录设定:single、daily、syslog 和 errorlog。修改 config/app.php 配置文件中的 log 选项即可使用你想要的日志存储模式。例如,我们不希望日志都记录在一个文件里,而是一天的日志单独放在一个文件里,那么把 log 设定为 daily 即可:

'log' => 'daily'

设定日志文件的最大数量

使用 daily 日志模式时,默认 Laravel 只会保存最近 5 日的日志文件。如果要调整,要在 config/app.php 再添加个 log_max_files 字段指定即可:

'log_max_files' => 30

日志安全级别

Laravel 日志管理使用的是 Monolog 这个 PHP 日志库,Laravel 的 日志安全级别就是指 Monolog 所能支持的日志安全级别。由 config/app.php 的 log_level 字段值决定,默认是 debug。

Monolog 日志安全级别从低到高分别是:debug、info、notice、warning、error、critical、alert 和 emergency。

安全级别设定好后,Laravel 会记录包括当前级别在内、所有更高级别的日志类型。就是说,当你设定 log_level 的值为 error 的时候,被记录的消息范围包括:error、critical、alert 和 emergency。

'log_level' => env('APP_LOG_LEVEL', 'error'),

自定义 Monolog 配置

如果你想完全掌控 Monolog 在 Laravel 中的配置,可以使用 $app 的 configureMonologUsing 方法,这个方法是在 bootstrap/app.php 中返回 $app 之前调用。

$app->configureMonologUsing(function ($monolog) {

$monolog->pushHandler(...);

});

return $app;

自定义频道名

默认,Monolog 初始化采用的名称与当前环境一致,比如 production 或者 local。如果需要自定义,要在 config/app.php 添加一个 log_channel 选项。

'log_channel' => env('APP_LOG_CHANNEL', 'my-app-name'),

异常处理程序

report 方法

所有异常都是由 App\Exceptions\Handler 类处理的,这个类中包含两个方法:report 和 render,我们将分别介绍。report 方法用来记录异常,或者将异常日志发送给像 Bugsnnag、Sentry 这样的第三方服务。默认,report 方法会简单地把异常直接传递给基类,让基类处理记录日志的操作。当然,记录日志的方式你也可以自在设定。

例如,我们使用 PHP instanceof 比较操作符,根据异常实例的类型记录异常。

/**

* Report or log an exception.

*

* This is a great spot to send exceptions to Sentry, Bugsnag, etc.

*

* @param \Exception $exception

* @return void

*/

public function report(Exception $exception)

{

if ($exception instanceof CustomException) {

//

}

return parent::report($exception);

}

report 辅助函数

有时,需要在报告异常的同时接着出来当前的请求,全局 report 辅助函数就是做这个的,它在报告异常的时候,不会产生异常页面。

public function isValid($value)

{

try {

// Validate the value...

} catch (Exception $e) {

report($e);

return false;

}

}

忽略的异常类型

异常处理器中的 dontReport 数组属性,用来设定不被处理的异常类型。例如,例如,404 错误导致的异常以及其他几个类型的错误不会写入日志文件。

/**

* A list of the exception types that should not be reported.

*

* @var array

*/

protected $dontReport = [

\Illuminate\Auth\AuthenticationException::class,

\Illuminate\Auth\Access\AuthorizationException::class,

\Symfony\Component\HttpKernel\Exception\HttpException::class,

\Illuminate\Database\Eloquent\ModelNotFoundException::class,

\Illuminate\Validation\ValidationException::class,

];

render 方法

render 方法负责将一个异常转换为发送给浏览器的 HTTP 响应。默认传递给基类的异常都会被处理成一个响应,你或者可以根据异常类型类自定义异常响应界面。

/**

* Render an exception into an HTTP response.

*

* @param \Illuminate\Http\Request $request

* @param \Exception $exception

* @return \Illuminate\Http\Response

*/

public function render($request, Exception $exception)

{

if ($exception instanceof CustomException) {

return response()->view('errors.custom', [], 500);

}

return parent::render($request, $exception);

}

拥有 report 和 render 方法的异常类

如果异常类中包含了 report 和 render,这就避免了我们在 Handler 类中检查异常类型,然后 report 和 render 异常带来的麻烦。这两个方法会在异常发生时,自动被框架调用:

namespace App\Exceptions;

use Exception;

class RenderException extends Exception

{

/**

* Report the exception.

*

* @return void

*/

public function report()

{

//

}

/**

* Render the exception into an HTTP response.

*

* @param \Illuminate\Http\Request

* @return \Illuminate\Http\Response

*/

public function render($request)

{

return response(...);

}

}

HTTP 异常

你可以使用全局辅助函数 abort 直接在程序里抛出异常,比如「页面未找到」的 404 错误,「未认证」 的 401 错误,甚至是 500 「程序内部错误」。

abort(404);

abort 抛出的异常会立即被 Handler 处理,渲染成错误页面。你也可以使用第二个可选参数,设置响应文本。

abort(403, 'Unauthorized action.');

自定义 HTTP 错误页面

根据 HTTP 状态码来显示对应的错误页面,在 Laravel 中操作起来非常简单。比如,你要为 404 HTTP 状态码指定一个错误页面,创建 resources/views/errors/404.blade.php 文件即可,当 404 异常发生时,会自动采用这个页面。就是说你在 resources/views/errors/ 目录下,直接以 HTTP 状态码定义的文件,最终都会在对应异常发生时采用、并渲染出来。abort 函数产生的 HttpException 实例对象会以 $exception 变量的形式传递给视图。

{{ $exception->getMessage() }}

日志记录

Laravel 在强大的 Monolog 库之上提供了一个简单的抽象层。默认,Laravel 是在 storage/logs 目录下创建日志文件的。你可以使用 Log 门面记录日志。

namespace App\Http\Controllers;

use App\User;

use Illuminate\Support\Facades\Log;

use App\Http\Controllers\Controller;

class UserController extends Controller

{

/**

* Show the profile for the given user.

*

* @param int $id

* @return Response

*/

public function showProfile($id)

{

Log::info('Showing user profile for user: '.$id);

return view('user.profile', ['user' => User::findOrFail($id)]);

}

}

咱们的 Log 提供了在 RFC 5424 定义的 8 个日志等级,分别是: emergency、alert、critical、error、warning、notice、info 和 debug。

Log::emergency($message);

Log::alert($message);

Log::critical($message);

Log::error($message);

Log::warning($message);

Log::notice($message);

Log::info($message);

Log::debug($message);

文本信息

也可以给 Log 的这些方法传递可选的文本信息,这些信息会被格式化,输出在日志信息中。

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

获得底层 Monolog 实例对象

Monolog 还有许多其他的日志处理方法,如果需要,你可以直接访问底层的 Monolog 实例对象:

$monolog = Log::getMonolog();

本作品采用《CC 协议》,转载必须注明作者和本文链接

php laravel日志报错,Laravel 文档阅读:错误 日志记录相关推荐

  1. java安装报错循环冗余检查_SQLSERVER2012备份日志报错:”读取失败: 23(数据错误(循环冗余检查)。)”...

    SQLSERVER2012备份日志报错:"读取失败: 23(数据错误(循环冗余检查).)" 问题: SQLSERVER2012数据库,8月6日的LOG自动备份出现问题,之前备份一直 ...

  2. java文档注释报错,java文档注释主要使用方法

    一.java包含哪些注释 1.//用于单行注释. 2./*...*/用于多行注释,从/*开始,到*/结束,不能嵌套. 3./**...*/则是为支持jdk工具javadoc.exe而特有的注释语句.这 ...

  3. Mybatis逆向生成报错:文档根元素 “project“ 必须匹配 DOCTYPE 根 “null“。

    今天使用mybatis-generator逆向生成代码时报错: 经检查,错误原因如下:

  4. linux保存日志报错,为什么在Linux上错误mongod死了,但子系统被锁定,可用空间不足以存放日志文件?...

    我已经在Linux CentOS服务器上安装了 mongo-10gen mongo-10gen- server. 我遵循Link 的步骤. 我已经将 /etc/mongod.conf 配置为- log ...

  5. oracle 10035 err 942,案例:Oracle日志报错 Fatal NI connect error 12170 TNS-12535 TNS-00505

    天萃荷净 Oracle数据库alert日志文件报错Fatal NI connect error 12170,通过查看mos相关文章找到解决办法 今天在一台服务器的日志文件中,发现如下信息: Fatal ...

  6. spring日志报错提醒_使用爬虫框架htmlunit整合springboot出现的一个不兼容问题

    使用爬虫框架htmlunit整合springboot不兼容的一个问题 本来使用htmlunit爬虫爬取数据非常正常好用,之前一直是直接java程序或者整合Javaswing界面,都没有问题,但是后来整 ...

  7. zabbix server下数据库日志报错

    数据库日志报错 postgres@ubuntu:~$ cat logfile FATAL: no pg_hba.conf entry for host "::1", user &q ...

  8. 2021-08-15nginx访问502,日志报错:connect() to 127.0.0.1:180 failed (13: Permission denied)解决

    nginx访问502,日志报错:connect() to 127.0.0.1:180 failed (13: Permission denied)解决 安装启动nginx配置以后,访问报502错误,然 ...

  9. HBase hmaster无法正常启动,日志报错Operation category READ is not supported in state standby.hdfs ha hbase配置修改

    E2:HBase hmaster无法正常启动,日志报错Operation category READ is not supported in state standby. hdfs配置了ha,hbas ...

  10. 记一次rsync日志报错directory has vanished

    中午两点的时候邮件告知rsync同部svn源库失败,看rsync日志报错显示如上,当时还在上课,没在公司,怀疑是不是有人动了svn的版本库,后来询问同事并通过vpn登录服务器上查看版本库是正常的,也没 ...

最新文章

  1. iOS开发UI基础—手写控件,frame,center和bounds属性
  2. 乐高小颗粒履带机器人_玩转乐高大颗粒积木(四十二)——乐高不倒翁、轮式是挖掘机、大颗粒皮筋车...
  3. rust(52)-二叉最大堆BinaryHeap
  4. 乐观锁与悲观锁深入学习
  5. [js高手之路]使用原型对象(prototype)需要注意的地方
  6. 基于文本知识库的强化学习技术——Learning to Win by Reading Manuals in a Monte-Carlo Framework
  7. 剑指offer:55-58记录
  8. leveldb——leveldb入门篇之Linux下编译配置和使用
  9. 使用python把txt文件转为csv文件并且利用自己想要的分割符号
  10. 八类网线和七类网线的区别_超6类和7类网线的区别
  11. 计算机键盘标注,电脑键盘上怎么打√和×
  12. 海天老师 资深TTT/思维训练专家
  13. GitLab 如何删除 Forked from
  14. 叮~你的假期余额不足,这份“收心指南”请收好!
  15. error: ‘uint8_t’,‘uint16_t’ ,‘uint32_t’ does not name a type
  16. OJ题库1015: 计算时间间隔
  17. 阿里妈妈CMO沈威:用品牌建设视角看待电商营销
  18. wps怎么删除分节符以及段落边框产生分隔线的取消方法
  19. 【UML】关系之依赖关系
  20. 某东MAOTAI秒杀软件的优化思路

热门文章

  1. 90KB的3D游戏(像CS一样)[汇编界又一奇迹]绝对震撼,操作和CS一样!
  2. AXURE版富文本输入框(富文本编辑器)教程+下载
  3. golang程序员前景怎么样?Python、Java、go语言的优势互比
  4. 如何使用PDF编辑软件给PDF删除页码
  5. 大数据 百亿级实时查询 ClickHouse SQL mysql canal kafka 数据实时同步
  6. word流程图怎么使箭头对齐_word怎么将图形对齐
  7. 方法的重载和重写的区别
  8. excel单元格格式设置
  9. 湘潭大学2022软件工程程序设计实践平时练习二C/C++
  10. python金融数据缺失处理_机器学习之Python数据缺失处理