Log caught exception with stack trace
error_log($e);
does what you want. It logs exactly the same thing that would have been logged if you didn't catch the exception, minus the word 'Uncaught' at the beginning. It does this because that's what the Exception
class's __toString()
magic method returns.
You can do this in a catch
block:
try {
foo();
} catch (Exception $e) {
error_log("Caught $e");
}
Or in the exception handler:
set_exception_handler(function($exception) {
error_log($exception);
error_page("Something went wrong!");
});
We use Monolog to do the logging in our application. Monolog has a formatter that can print stack traces. To log exceptions with traces, we use a LineFormatter and call includeStacktraces() on it. (code below)
$handler = new \Monolog\Handler\StreamHandler(STDOUT);
$lineFormatter = new \Monolog\Formatter\LineFormatter();
$lineFormatter->includeStacktraces();
$handler->setFormatter($lineFormatter);
$logger = new \Monolog\Logger('root', [$handler]);
try {
//do some throwing
} catch (Exception $e) {
//do some logging, add exception to context
$logger->error($e->getMessage(), ['exception' => $e]);
}
You can use the methods from PHP's base Exception
class.
Use getMessage
to get the message Oh no!
and use getTraceAsString
to get a formatted trace.