Laravel 5 Отправить ошибки по электронной почте

Я пытаюсь выяснить, как я могу отправить ошибки на мой адрес электронной почты в Laravel 5. Мне не очень повезло найти хорошие ресурсы.

Раньше были хорошие пакеты, такие как: https://github.com/TheMonkeys/laravel-error-emailer. Это сделало это для вас в Laravel 4.

Они еще не выпустили обновление Laravel5 из-за того, как они изменили обработку ошибок … что я также не знаю.

У меня есть несколько приложений Laravel 5, которые мне нужно отслеживать, но мне нужен более эффективный способ сделать это, кроме проверки журналов ошибок в хранилище.

Любая помощь будет принята с благодарностью. Я знаю, что есть и другие, ищущие эту информацию.

Related of "Laravel 5 Отправить ошибки по электронной почте"

Вы можете сделать это, поймав все ошибки в App\Exceptions\Handler::report() . Итак, в вашем App/Exceptions/Handler.php добавьте функцию report если ее еще нет.

 /** * Report or log an exception. * * This is a great spot to send exceptions to Sentry, Bugsnag, etc. * * @param \Exception $e * @return void */ public function report(\Exception $e) { if ($e instanceof \Exception) { // emails.exception is the template of your email // it will have access to the $error that we are passing below Mail::send('emails.exception', ['error' => $e->getMessage()], function ($m) { $m->to('your email', 'your name')->subject('your email subject'); }); } return parent::report($e); } 

Если вам нужна дополнительная информация, обратитесь к почтовой программе и ошибкам формы laravel.

EDIT: я нашел стороннюю систему журналов, созданную для Laravel

http://www.understand.io

Очень приятное решение, не посылает меня по электронной почте, но это работает для того, что мне нужно.

Я играл с этим и просматривал основные файлы Laravel и придумал что-то похожее на то, что вы видите на странице с ошибкой.

Вам просто нужно создать файл представления, который отображает $ content для электронной почты

 public function report(\Exception $e) { if ($e instanceof \Exception) { $debugSetting = Config::get('app.debug'); Config::set('app.debug', true); if (ExceptionHandler::isHttpException($e)) { $content = ExceptionHandler::toIlluminateResponse(ExceptionHandler::renderHttpException($e), $e); } else { $content = ExceptionHandler::toIlluminateResponse(ExceptionHandler::convertExceptionToResponse($e), $e); } Config::set('app.debug', $debugSetting); $data['content'] = (!isset($content->original)) ? $e->getMessage() : $content->original; Mail::queue('errors.emails.error', $data, function ($m) { $m->to('email@email.com', 'Server Message')->subject('Error'); }); } return parent::report($e); } 

Для этого вы можете использовать обработчик исключений . Поместите свой почтовый код в функцию отчета, и он будет отправлять вам сообщение об ошибке каждый раз, когда это происходит.

Вот решение для Laravel 5.3

 #file: /app/Exceptions/Handler.php public function report(Exception $e) { if($this->shouldReport($e)){ \Mail::send( ['html' => 'error.emails.exception'], ['content' => $data['content']], function ($m) { $m->from(['myemail@from.com']); $m->to(['myemail@to.com']); $m->subject('Crash Report'); } ); } parent::report($e); } 
  • Вам необходимо создать файл exception.blade.php в / resources / views / emails
  • Я советую вам использовать этот контент , чтобы электронная почта выглядела так же, как страница ошибок Laravel.

Остальные ответы кажутся совершенно правильными. Мы сделали это некоторое время назад и обнаружили одну большую проблему: если команда mail не работает, это может привести к бесконечному циклу сбрасывания ошибки и попытке отправить соответствующее письмо, что приведет к сбою снова … Это быстро заполнит журнал и убьет ваш сервер.

Имейте это в виду и не отправляйте электронное письмо в этом случае.

Side Note: Я решил поставить это в ответ, потому что он имеет отношение ко всем ответам и не должен скрываться в одном комментарии.

Я расширил ответ на West55, чтобы включить в адресную информацию некоторые запросы. Полезно знать, особенно если вы хотите попробовать и продублировать ошибку самостоятельно. Он завернут в try / catch, чтобы убедиться, что мы не выбрасываем другое исключение, получая информацию о запросе.

  public function report(Exception $e) { if ($e instanceof Exception){ $debugSetting = \Config::get('app.debug'); // email err if debug off (in prod env) if (!$debugSetting){ \Config::set('app.debug', true); if (ExceptionHandler::isHttpException($e)) { $content = ExceptionHandler::toIlluminateResponse(ExceptionHandler::renderHttpException($e), $e); } else { $content = ExceptionHandler::toIlluminateResponse(ExceptionHandler::convertExceptionToResponse($e), $e); } \Config::set('app.debug', $debugSetting); $lc2 = (isset($content->original)) ? $content->original : $e->getMessage(); // add request info to err msg $lc1= ''; try{ $request= request(); $lc1= "<div>" . "-- Request --<br>" . "<br>Method: " . $request->getMethod() . "<br>Uri: " . $request->getUri() . "<br>Ip: " . $request->getClientIp() . "<br>Referer: " . $request->server('HTTP_REFERER') . "<br>Is secure: " . $request->isSecure() . "<br>Is ajax: " . $request->ajax() . "<br>User agent: " . $request->server('HTTP_USER_AGENT') . "<br>Content:<br>" . nl2br(htmlentities($request->getContent())) . "</div>"; }catch (Exception $e2){} if (strpos($lc2, '</body>') !== false){ $lc2= str_replace('</body>', $lc1 . '</body>', $lc2); }else{ $lc2.= $lc1; } $la2['content']= $lc2; //put into array for blade $ln1= Mail::send('emails.exception2', $la2, function($m){ $m->to('support@mydomain.com') ->subject('Fatal Error'); }); } } parent::report($e); }