2017-09-29 4 views
0

Laravelでエラーをログに記録しようとしていますが、レンダリング機能に到達する前にChromeのデフォルト500エラーページがスローされます。Laravel:ロギングエラーと素晴らしい表示を表示

すべてのエラーをデータベースに記録し、ユーザーフレンドリーなカスタムビューを表示したいが、レンダリングメソッドにそれができないときはどうすればよいですか?

public function render($request, Exception $exception) 

それでは、どのようにエラーをログに記録するためのものです:

Laravelはそれになりませんか?これは非常に多くの点で間違っているようです。また

public function render($request, Exception $exception) 
{ 
    if (strlen($exception->getMessage()) > 0) { 
     $agent = new Agent(); 
     $errorLog = new ErrorLog; 
     $errorLog->error_message = $exception->getMessage(); 
     $errorLog->error_file = $exception->getFile(); 
     $errorLog->error_line = $exception->getLine(); 
     $errorLog->request_ip = $request->ip(); 
     $errorLog->request_url = $request->root(); 
     $errorLog->request_device = $agent->isDesktop() ? 'Desktop' : ($agent->isMobile() ? 'Mobile' : 'Tablet'); 
     $errorLog->request_system = $agent->platform() . ' ' . $agent->version($agent->platform()); 
     $errorLog->request_browser = $agent->browser(); 
     $errorLog->error_happened_to = (Auth::check() ? Auth::user()->username : 'Guest'); 
     $errorLog->save(); 
    } 

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

、私.EVNファイル:

APP_NAME=Laravel 
APP_ENV=local 
APP_KEY=************************************************* 
APP_DEBUG=true 
APP_LOG_LEVEL=debug 
APP_URL=************ 

答えて

1

これは、私は同じ問題を処理する方法です。アプリ/例外/ Handler.phpで:

public function report(Exception $exception) 
{ 
    if(!config('app.debug')) { 
     if ($this->shouldReport($exception)) { 
      $this->logError($exception); 
     } 
    } 
    if(env('APP_ENV') == 'local'){ 
     parent::report($exception); 
    } 
} 

public function render($request, Exception $exception) 
{ 
    if(!config('app.debug')) { 
     if($this->shouldReport($exception)){ 
      return response()->view('errors.500', compact('exception')); 
     } 
    } 
    return parent::render($request, $exception); 
} 

は、私は、データベースにエラーが書き込まれた機能のlogErrorを追加した、と私は、リソース/ビュー/エラーでテンプレートがある - 500.blade.php - ありカスタムエラーページ。

また、.envでAPP_DEBUGを使用して、エラーをデータベースに記録し、エラーページを表示するか、エラーの詳細を画面に表示するかどうかを決定します。

+0

このアプローチが大好きです、ありがとうございます! –

0

Laravelはエラーが

//ファイルのApp \の例外を発生したときにログインしたり、あなたが欲しいものを行うために使用できるレポートの方法を持っている\ Handler.php; Handler.phpでこのメソッドを追加または変更します。

public function report(Exception $exception) 
{ 
    if ($this->shouldReport($exception)) { //prevent uneccessary error reporting such as 404 errors 

     $e =FlattenException::create($exception); 
     $handler =new \Symfony\Component\Debug\ExceptionHandler(); 
     $error_message =$handler->getHtml($e); ///Note this will give u full details of the error 
      $agent = new Agent(); 
    $errorLog = new ErrorLog; 
    $errorLog->error_message = $error_message; 
    $errorLog->error_file = $exception->getFile(); 
    $errorLog->error_line = $exception->getLine(); 
    $errorLog->request_ip = $request->ip(); 
    $errorLog->request_url = $request->root(); 
    $errorLog->request_device = $agent->isDesktop() ? 'Desktop' : ($agent->isMobile() ? 'Mobile' : 'Tablet'); 
    $errorLog->request_system = $agent->platform() . ' ' . $agent->version($agent->platform()); 
    $errorLog->request_browser = $agent->browser(); 
    $errorLog->error_happened_to = (Auth::check() ? Auth::user()->username : 'Guest' 

    parent::report($exception); 
} 

例えばAPP_DEBUG = falseを

を、あなたの素晴らしい眺めをご覧.envを変更し、trueからfalseにAPP_DEBUGを変更するには、また、アプリは、生産上にある場合にのみ、エラーをログに記録することを決定することができます。

if (App::environment('production')) { 
//log stuffs 
} 

カスタム

resources/views/errors/500.blade.php 

enter image description here Laravelで500エラーは自動的にログ&ショーのエラーのため、サードパーティのパッケージを試すことができ、そのページ

+0

どうすれば$リクエストを関数に渡すことができますか?それをしようとするとエラーを投げるので、難しいようです。 –

+0

これは、カスタムビューの表示方法についても説明していません。設定ビューを表示する方法のみを示しています。 –

+0

カスタムビューを表示するには、このような名前500.blade.phpのビューを追加します。/resources/views/errors/500.blade.php –

関連する問題