Log caught exception with stack trace

PhpExceptionLogging

Php Problem Overview


If I don't catch an exception in PHP, I get a helpful error message in my error.log file with a stack trace. For example, if I run:

<?php

  function foo() {
    throw new Exception('Oh no!');
  } 

  foo();

?>

then I get this written to my logs:

> [Wed Mar 06 10:35:32 2013] [error] [client 86.146.145.175] PHP Fatal > error: Uncaught exception 'Exception' with message 'Oh no!' in > /var/www/test.php:4\nStack trace:\n#0 /var/www/test.php(7): > foo()\n#1 {main}\n thrown in /var/www/test.php on line 4

Sometimes I'd like to catch the exception but still log that detail. I'm imagining something like:

<?php

  function foo() {
    throw new Exception('Oh no!');
  } 

  try {
      foo();
  } catch (Exception $e) {
      log_exception($e);
  }

?>

where log_exception will write to the error log something in basically the same format as what gets automatically written for an uncaught exception - perhaps literally identical besides having Caught exception instead of PHP Fatal error: Uncaught exception.

Is there a built-in function to log exception info like this, or to capture it to a string? I'm imagining something analagous to traceback.format_exc() in Python.

Php Solutions


Solution 1 - Php

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!");
});

Solution 2 - Php

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.

Solution 3 - Php

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]);
}

Solution 4 - Php

You can use http://php.net/manual/en/function.set-exception-handler.php to register a callback function which would get the message from $e->getMessage(); and dump it to file.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMark AmeryView Question on Stackoverflow
Solution 1 - PhpJay KView Answer on Stackoverflow
Solution 2 - PhpenricogView Answer on Stackoverflow
Solution 3 - PhpEelke van den BosView Answer on Stackoverflow
Solution 4 - PhpvaruogView Answer on Stackoverflow