mirror of
https://github.com/Seldaek/monolog.git
synced 2025-08-06 05:07:36 +02:00
Catch json_encode recursion error
This commit is contained in:
@@ -54,16 +54,24 @@ class WildfireFormatter extends NormalizerFormatter
|
|||||||
|
|
||||||
$record = $this->normalize($record);
|
$record = $this->normalize($record);
|
||||||
$message = array('message' => $record['message']);
|
$message = array('message' => $record['message']);
|
||||||
|
$handleError = false;
|
||||||
if ($record['context']) {
|
if ($record['context']) {
|
||||||
$message['context'] = $record['context'];
|
$message['context'] = $record['context'];
|
||||||
|
$handleError = true;
|
||||||
}
|
}
|
||||||
if ($record['extra']) {
|
if ($record['extra']) {
|
||||||
$message['extra'] = $record['extra'];
|
$message['extra'] = $record['extra'];
|
||||||
|
$handleError = true;
|
||||||
}
|
}
|
||||||
if (count($message) === 1) {
|
if (count($message) === 1) {
|
||||||
$message = reset($message);
|
$message = reset($message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle json_encode recursion error
|
||||||
|
if ($handleError) {
|
||||||
|
set_error_handler(function () { });
|
||||||
|
}
|
||||||
|
|
||||||
// Create JSON object describing the appearance of the message in the console
|
// Create JSON object describing the appearance of the message in the console
|
||||||
$json = json_encode(array(
|
$json = json_encode(array(
|
||||||
array(
|
array(
|
||||||
@@ -75,6 +83,10 @@ class WildfireFormatter extends NormalizerFormatter
|
|||||||
$message,
|
$message,
|
||||||
));
|
));
|
||||||
|
|
||||||
|
if ($handleError) {
|
||||||
|
restore_error_handler();
|
||||||
|
}
|
||||||
|
|
||||||
// The message itself is a serialization of the above JSON object + it's length
|
// The message itself is a serialization of the above JSON object + it's length
|
||||||
return sprintf(
|
return sprintf(
|
||||||
'%s|%s|',
|
'%s|%s|',
|
||||||
|
@@ -108,4 +108,41 @@ class WildfireFormatterTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
$wildfire->formatBatch(array($record));
|
$wildfire->formatBatch(array($record));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test issue #137 (https://github.com/Seldaek/monolog/pull/137)
|
||||||
|
*/
|
||||||
|
public function testFormatWithObjectsInContext()
|
||||||
|
{
|
||||||
|
// Set up the recursion
|
||||||
|
$foo = new \stdClass();
|
||||||
|
$bar = new \stdClass();
|
||||||
|
|
||||||
|
$foo->bar = $bar;
|
||||||
|
$bar->foo = $foo;
|
||||||
|
|
||||||
|
$record = array(
|
||||||
|
'message' => "foo",
|
||||||
|
'level' => 300,
|
||||||
|
'channel' => 'foo',
|
||||||
|
'context' => array(
|
||||||
|
'stack' => array(
|
||||||
|
array($foo),
|
||||||
|
array($bar),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'extra' => array(),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Set an error handler to assert that the error is not raised anymore
|
||||||
|
$that = $this;
|
||||||
|
set_error_handler(function ($level, $message, $file, $line, $context) use ($that) {
|
||||||
|
$that->fail("$message should not be raised anymore");
|
||||||
|
});
|
||||||
|
|
||||||
|
$wildfire = new WildfireFormatter();
|
||||||
|
$wildfire->format($record);
|
||||||
|
|
||||||
|
restore_error_handler();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user