Commit 9f4a122f authored by Dave Marshall's avatar Dave Marshall

Log a little more information about exceptions

parent e358f4bc
...@@ -18,6 +18,7 @@ use Silex\ServiceProviderInterface; ...@@ -18,6 +18,7 @@ use Silex\ServiceProviderInterface;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Bridge\Monolog\Handler\DebugHandler; use Symfony\Bridge\Monolog\Handler\DebugHandler;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
/** /**
* Monolog Provider. * Monolog Provider.
...@@ -75,7 +76,12 @@ class MonologServiceProvider implements ServiceProviderInterface ...@@ -75,7 +76,12 @@ class MonologServiceProvider implements ServiceProviderInterface
}); });
$app->error(function (\Exception $e) use ($app) { $app->error(function (\Exception $e) use ($app) {
$app['monolog']->addError($e->getMessage()); $message = sprintf('%s: %s (uncaught exception) at %s line %s', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine());
if (!$e instanceof HttpExceptionInterface || $e->getStatusCode() >= 500) {
$app['monolog']->addCritical($message);
} else {
$app['monolog']->addError($message);
}
}, 255); }, 255);
$app->after(function (Request $request, Response $response) use ($app) { $app->after(function (Request $request, Response $response) use ($app) {
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
namespace Silex\Tests\Provider; namespace Silex\Tests\Provider;
use Monolog\Handler\TestHandler; use Monolog\Handler\TestHandler;
use Monolog\Logger;
use Silex\Application; use Silex\Application;
use Silex\Provider\MonologServiceProvider; use Silex\Provider\MonologServiceProvider;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
...@@ -68,20 +69,49 @@ class MonologServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -68,20 +69,49 @@ class MonologServiceProviderTest extends \PHPUnit_Framework_TestCase
{ {
$app = $this->getApplication(); $app = $this->getApplication();
$app->get('/error', function () {
throw new \RuntimeException('very bad error');
});
$app->error(function (\Exception $e) { $app->error(function (\Exception $e) {
return 'error handled'; return 'error handled';
}); });
/**
* Simulate 404, logged to error level
*/
$this->assertFalse($app['monolog.handler']->hasErrorRecords()); $this->assertFalse($app['monolog.handler']->hasErrorRecords());
$request = Request::create('/error'); $request = Request::create('/error');
$app->handle($request); $app->handle($request);
$this->assertTrue($app['monolog.handler']->hasError('very bad error')); $records = $app['monolog.handler']->getRecords();
$pattern = "#Symfony\\\\Component\\\\HttpKernel\\\\Exception\\\\NotFoundHttpException: No route found for \"GET /error\" \(uncaught exception\) at .* line \d+#";
$this->assertMatchingRecord($pattern, Logger::ERROR, $app['monolog.handler']);
/**
* Simulate unhandled exception, logged to critical
*/
$app->get('/error', function () {
throw new \RuntimeException('very bad error');
});
$this->assertFalse($app['monolog.handler']->hasCriticalRecords());
$request = Request::create('/error');
$app->handle($request);
$pattern = "#RuntimeException: very bad error \(uncaught exception\) at .*Silex/Tests/Provider/MonologServiceProviderTest\.php line \d+#";
$this->assertMatchingRecord($pattern, Logger::CRITICAL, $app['monolog.handler']);
}
protected function assertMatchingRecord($pattern, $level, $handler)
{
$found = false;
$records = $handler->getRecords();
foreach ($records as $record) {
if (preg_match($pattern, $record['message']) && $record['level'] == $level) {
$found = true;
continue;
}
}
$this->assertTrue($found, "Trying to find record matching $pattern with level $level");
} }
protected function getApplication() protected function getApplication()
...@@ -97,3 +127,4 @@ class MonologServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -97,3 +127,4 @@ class MonologServiceProviderTest extends \PHPUnit_Framework_TestCase
return $app; return $app;
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment