1
0
mirror of https://github.com/Seldaek/monolog.git synced 2025-08-06 05:07:36 +02:00

Better support for PHP7 \Throwable

This commit is contained in:
Nerijus Eimanavičius
2016-08-28 00:47:02 +03:00
parent f42fbdfd53
commit 6586425a31
2 changed files with 31 additions and 2 deletions

View File

@@ -12,6 +12,7 @@
namespace Monolog\Formatter;
use Exception;
use Throwable;
/**
* Encodes whatever record data is passed to it as json
@@ -152,7 +153,7 @@ class JsonFormatter extends NormalizerFormatter
return $normalized;
}
if ($data instanceof Exception) {
if ($data instanceof Exception || $data instanceof Throwable) {
return $this->normalizeException($data);
}
@@ -170,7 +171,7 @@ class JsonFormatter extends NormalizerFormatter
protected function normalizeException($e)
{
// TODO 2.0 only check for Throwable
if (!$e instanceof Exception && !$e instanceof \Throwable) {
if (!$e instanceof Exception && !$e instanceof Throwable) {
throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.get_class($e));
}

View File

@@ -119,4 +119,32 @@ class JsonFormatterTest extends TestCase
}
$this->assertEquals('{"level_name":"CRITICAL","channel":"core","context":{"exception":{"class":"RuntimeException","message":"'.$exception->getMessage().'","code":'.$exception->getCode().',"file":"'.$pathException.':'.$exception->getLine().'","previous":{"class":"LogicException","message":"'.$exception->getPrevious()->getMessage().'","code":'.$exception->getPrevious()->getCode().',"file":"'.$pathPrevious.':'.$exception->getPrevious()->getLine().'"}}},"datetime":'.json_encode(new \DateTime()).',"extra":[],"message":"foobar"}'."\n", $message);
}
public function testDefFormatWithThrowable()
{
if (!class_exists('Error') || !is_subclass_of('Error', 'Throwable')) {
$this->markTestSkipped('Requires PHP >=7');
}
$formatter = new JsonFormatter();
$throwable = new \Error('Foo');
$dateTime = new \DateTime();
$message = $formatter->format(array(
'level_name' => 'CRITICAL',
'channel' => 'core',
'context' => array('exception' => $throwable),
'datetime' => $dateTime,
'extra' => array(),
'message' => 'foobar',
));
if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
$path = substr(json_encode($throwable->getFile(), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE), 1, -1);
$encodedDateTime = json_encode($dateTime, JSON_UNESCAPED_SLASHES);
} else {
$path = substr(json_encode($throwable->getFile()), 1, -1);
$encodedDateTime = json_encode($dateTime);
}
$this->assertEquals('{"level_name":"CRITICAL","channel":"core","context":{"exception":{"class":"'.get_class($throwable).'","message":"'.$throwable->getMessage().'","code":'.$throwable->getCode().',"file":"'.$path.':'.$throwable->getLine().'"}},"datetime":'.$encodedDateTime.',"extra":[],"message":"foobar"}'."\n", $message);
}
}