'exception-handler::emails.exception', 'text' => 'exception-handler::emails.exception-plain' ], [ 'appName' => config('app.name'), 'code' => $e->getCode(), 'line' => $e->getLine(), 'ename' => \get_class($e), 'emessage' => self::getAnonymizedMessage($e->getMessage()), 'file' => str_replace(\realpath(\sprintf('%s/../', \app_path())), '', $e->getFile()), 'stackTrace' => self::getAnonymizedStackTrace($e), 'uri' => app()->runningInConsole() ? 'CONSOLE' : ( (request() and request()->fullUrl()) ? request()->fullUrl() : 'none') ], function ($m) { /** @var \Illuminate\Mail\Message $m */ $m->to( config('mail.contactsList.serviceweb'), sprintf('%s Exception Handler', config('app.name')) )->subject('Need help !, an error occured in your application, please check Logs ASAP'); }); Log::alert(sprintf('Envoie d\'une erreur par mail : %s', json_encode($e))); } /** * Anonymize at least Sql queries * * @param string $message * @return string */ private static function getAnonymizedMessage(string $message): string { $message = \preg_replace('/^(.*)( \(SQL:.*\))$/', '$1', $message) ?? $message; return $message; } /** * Anonymize stack trace * * @param Throwable $e * @return string */ private static function getAnonymizedStackTrace(Throwable $e): string { $projectPath = \realpath(\sprintf('%s/../', \app_path())); $traceStack = $e->getTrace(); $traceStr = ''; $maxStackStage = 0; foreach ($traceStack as $stackStage => $stack) { $maxStackStage = $stackStage; $traceStr .= \sprintf( '#%s %s(%d): ', $stackStage, str_replace($projectPath, '', $stack['file']), $stack['line'] ); $traceStr .= "{$stack['class']}->{$stack['function']}("; $traceArgs = ''; if (isset($stack['args'])) { $argsCount = count($stack['args']); for ($i = 0; $i < $argsCount; $i++) { $type = \gettype($stack['args'][$i]); switch ($type) { case 'object': $traceArgs .= sprintf('Object(%s)', \get_class($stack['args'][$i])); break; case 'array': $traceArgs .= sprintf('Array(%d)', \count($stack['args'][$i])); break; case 'string': $traceArgs .= sprintf('String(%d)', \strlen($stack['args'][$i])); break; default: $traceArgs .= \gettype($stack['args'][$i]); } $traceArgs .= ($i !== ($argsCount - 1) ? ',' : ''); } $traceStr .= $traceArgs; } //end if $traceStr .= ")\n"; } //end foreach $maxStackStage++; $traceStr .= "#$maxStackStage {main}"; return $traceStr; } }