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", 他們分別是:

  • 單文件日志;
  • 每日一文件日志;
  • 系統日志;
  • 錯誤日志;

處理錯誤對象及報錯信息

app\Exceptions\handler.php這個文件,這是處理所有錯誤信息的關鍵文件:

  1. namespace App\Exceptions;
  2. use Exception;
  3. use Symfony\Component\HttpKernel\Exception\HttpException;
  4. use Illuminate\Foundation\Exceptions\Handler 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'這個視圖;

自定義錯誤類

首先,在app\Exceptions\里建立一個自定義類:

  1. namespace App\Exceptions;
  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. App\User::find(-1);
  3. }catch(){
  4. throw new App\Exceptions\CustomException;
  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. @{{ \Symfony\Component\HttpFoundation\Response::$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信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM