错误和日志

介绍

首次开始使用OctoberCMS时,已经为您配置了错误和异常处理。 可以通过两种方式访问事件日志:

  1. 可以通过打开文件storage/logs/system.log在文件系统中查看事件日志。
  2. 或者,可以通过后台目录 系统>日志>事件日志 ,通过管理区域查看。

当前端页面显示出错误页面和一些异常类型时会产生错误日志

配置

错误细节

应用程序通过浏览器显示的错误详细信息量由config/app.php配置文件中的debug配置选项控制。 默认情况下,详细的错误报告会打开,因此查看详细的错误信息会很有帮助,这些信息对调试和故障排除问题很有用。 关闭此功能时,如果页面出现问题,将显示一般错误消息。

对于本地开发,您应该将debug值设置为true。 在生产环境中,此值应始终为“false”。

  1. /*
  2. |--------------------------------------------------------------------------
  3. | Application Debug Mode
  4. |--------------------------------------------------------------------------
  5. |
  6. | When your application is in debug mode, detailed error messages with
  7. | stack traces will be shown on every error that occurs within your
  8. | application. If disabled, a simple generic error page is shown.
  9. |
  10. */
  11. 'debug' => false,

日志文件模式

十月支持singledailysyslogerrorlog日志记录模式。 例如,如果您希望使用每日的日志替代日志文件,则只需在config/app.php配置文件中设置log值:

  1. 'log' => 'daily'

可用的异常

October开始提供几种基本的异常类型。

应用异常

作为ApplicationException别名的October\Rain\Exception\ApplicationException类是在简单应用程序条件失败时使用的最常见的异常类型。

  1. throw new ApplicationException('You must be logged in to do that!');

错误消息将被简化,并且永远不会包含任何敏感信息,如php文件和行号。

系统异常

October\Rain\Exception\SystemException类,别名为SystemException,用于对系统运行至关重要且始终记录的错误。

  1. throw new SystemException('Unable to contact the mail server API');

抛出此异常时,将显示详细的错误消息,其中包含文件和行号。

验证异常

October\Rain\Exception\ValidationException类,别名为ValidationException,用于直接与表单提交和无效字段相关的错误。 该消息应包含一个包含字段和错误消息的数组。

  1. throw new ValidationException(['username' => 'Sorry that username is already taken!']);

您还可以传递验证服务的实例。

  1. $validation = Validator::make(...);
  2. if ($validation->fails()) {
  3. throw new ValidationException($validation);
  4. }

当抛出此异常时,AJAX框架将以可用格式提供此信息并聚焦第一个无效字段。

AJAX异常

October\Rain\Exception\AjaxException类,别名为AjaxException,被认为是“智能错误”并将返回HTTP代码406.这允许它们传递响应内容,就好像它们是成功的响应一样。

  1. throw new AjaxException(['#flashMessages' => $this->renderPartial(...)]);

抛出此异常时,AJAX框架 将遵循标准错误工作流程,但也将刷新指定的部分。

异常处理

所有异常都由October\Rain\Foundation\Exception\Handler类处理。 该类包含两个方法:reportrender,指示是否应记录错误以及如何响应错误。

但是,如果需要,您可以使用App::error方法指定自定义处理程序。 处理程序根据它们处理的异常的类型提示进行调用。 例如,您可以创建仅处理RuntimeException实例的处理程序:

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

如果异常处理程序返回响应,则该响应将发送到浏览器,并且不会调用其他错误处理程序:

  1. App::error(function(InvalidUserException $exception) {
  2. return 'Sorry! Something is wrong with this account!';
  3. });

要监听PHP致命错误,您可以使用App::fatal方法:

  1. App::fatal(function($exception) {
  2. //
  3. });

如果您有多个异常处理程序,则应从最通用到最具体的定义它们。 因此,例如,应该在自定义异常类型(如SystemException)之前定义处理所有类型Exception异常的处理程序。

放置错误处理程序的位置

错误处理程序注册(如事件处理程序)通常属于“引导代码”类别。 换句话说,它们准备应用程序以实际处理请求,并且通常需要在实际调用路由或控制器之前执行。 最常见的地方是插件注册文件boot方法。 或者,插件可以在插件目录中提供名为init.php的文件,您可以使用该文件来放置错误处理程序注册。

HTTP异常

一些例外描述了来自服务器的HTTP错误代码。 例如,这可能是“未找到页面”错误(404),“未授权错误”(401)或甚至是开发者生成500错误。 要从应用程序的任何位置生成此类响应,请使用以下命令:

  1. App::abort(404);

abort方法将立即引发一个由异常处理程序呈现的异常。 (可选)您可以提供响应文本:

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

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

自定义错误页面

默认情况下,任何错误都将显示一个详细的错误页面,其中包含发生错误的文件内容,行号和堆栈跟踪。 您可以通过在config/app.php脚本中将配置值debug设置为false并创建一个URL为/error的页面来显示自定义错误页面。

日志

默认情况下,October配置为为您的应用程序创建一个日志文件,该文件存储在storage/logs目录中。 您可以使用Logfacade将信息写入日志:

  1. $user = User::find(1);
  2. Log::info('Showing user profile for user: '.$user->name);

记录器提供RFC 5424中定义的八个记录级别:emergency, alert, critical, error, warning, notice, infodebug

  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. Log::info('User failed to login.', ['id' => $user->id]);

帮助方法

有一些全局帮助程序方法可以使日志记录更容易。 trace_log函数是Log::info的别名,支持使用数组和异常作为消息。

  1. // Write a string value
  2. $val = 'Hello world';
  3. trace_log('The value is '.$val);
  4. // Dump an array value
  5. $val = ['Some', 'array', 'data'];
  6. trace_log($val);
  7. // Trace an exception
  8. try {
  9. //
  10. }
  11. catch (Exception $ex) {
  12. trace_log($ex);
  13. }

trace_sql函数启用数据库日志记录,调用它时会记录发送到数据库的每个命令。 这些记录仅出现在system.log文件中,并且不会出现在管理区域日志中,因为它存储在数据库中并会导致反馈循环。

  1. trace_sql();
  2. Db::table('users')->count();
  3. // select count(*) as aggregate from users