diff --git a/src/Monolog/Formatter/JsonFormatter.php b/src/Monolog/Formatter/JsonFormatter.php index b737d82e3..753e6852c 100644 --- a/src/Monolog/Formatter/JsonFormatter.php +++ b/src/Monolog/Formatter/JsonFormatter.php @@ -192,6 +192,10 @@ protected function normalize($data, int $depth = 0) return $data; } + if (\get_class($data) === '__PHP_Incomplete_Class') { + return new \ArrayObject($data); + } + if (method_exists($data, '__toString')) { return $data->__toString(); } diff --git a/tests/Monolog/Formatter/JsonFormatterTest.php b/tests/Monolog/Formatter/JsonFormatterTest.php index 147021029..33f6b4d7d 100644 --- a/tests/Monolog/Formatter/JsonFormatterTest.php +++ b/tests/Monolog/Formatter/JsonFormatterTest.php @@ -297,6 +297,18 @@ public function testNormalizeHandleLargeArrays() $this->assertEquals('Over 1000 items (2000 total), aborting normalization', $res['context'][0]['...']); } + public function testCanNormalizeIncompleteObject(): void + { + $serialized = "O:17:\"Monolog\TestClass\":1:{s:23:\"\x00Monolog\TestClass\x00name\";s:4:\"test\";}"; + $object = unserialize($serialized); + + $formatter = new JsonFormatter(); + $record = ['context' => ['object' => $object]]; + $result = $formatter->format($record); + + self::assertSame('{"context":{"object":{"__PHP_Incomplete_Class_Name":"Monolog\\\\TestClass"}}}'."\n", $result); + } + public function testEmptyContextAndExtraFieldsCanBeIgnored() { $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, true, true);