From ad37c8e6638d6d21cf4deaca1aafb8c4a29a6d1b Mon Sep 17 00:00:00 2001 From: Will Banfield Date: Tue, 19 Jan 2016 15:54:46 -0500 Subject: [PATCH 1/6] Change 'save' to 'insert' in MongoDBHandler --- src/Monolog/Handler/MongoDBHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Monolog/Handler/MongoDBHandler.php b/src/Monolog/Handler/MongoDBHandler.php index 56fe755b..c08cce9f 100644 --- a/src/Monolog/Handler/MongoDBHandler.php +++ b/src/Monolog/Handler/MongoDBHandler.php @@ -45,7 +45,7 @@ class MongoDBHandler extends AbstractProcessingHandler if ($this->mongoCollection instanceof \MongoDB\Collection) { $this->mongoCollection->insertOne($record["formatted"]); } else { - $this->mongoCollection->save($record["formatted"]); + $this->mongoCollection->insert($record["formatted"]); } } From f6a9fdbb2c9ad9ef7f26269a1edb1de1c3b6d3cc Mon Sep 17 00:00:00 2001 From: Will Banfield Date: Wed, 20 Jan 2016 14:54:29 -0500 Subject: [PATCH 2/6] Add case for if manager is passed in --- src/Monolog/Handler/MongoDBHandler.php | 18 +++++++--- tests/Monolog/Handler/MongoDBHandlerTest.php | 37 ++++++++++++++++++-- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/Monolog/Handler/MongoDBHandler.php b/src/Monolog/Handler/MongoDBHandler.php index c08cce9f..15a24569 100644 --- a/src/Monolog/Handler/MongoDBHandler.php +++ b/src/Monolog/Handler/MongoDBHandler.php @@ -28,14 +28,20 @@ use Monolog\Formatter\NormalizerFormatter; class MongoDBHandler extends AbstractProcessingHandler { protected $mongoCollection; + protected $namespace; + protected $manager; public function __construct($mongo, $database, $collection, $level = Logger::DEBUG, $bubble = true) { - if (!($mongo instanceof \MongoClient || $mongo instanceof \Mongo || $mongo instanceof \MongoDB\Client)) { + if (!($mongo instanceof \MongoClient || $mongo instanceof \Mongo || $mongo instanceof \MongoDB\Client || $mongo instanceof \MongoDB\Driver\Manager)) { throw new \InvalidArgumentException('MongoClient, Mongo or MongoDB\Client instance required'); } - - $this->mongoCollection = $mongo->selectCollection($database, $collection); + $this->namespace = "$database.$collection"; + if($mongo instanceof \MongoDB\Driver\Manger) { + $this->manager = $mongo; + } else { + $this->mongoCollection = $mongo->selectCollection($database, $collection); + } parent::__construct($level, $bubble); } @@ -44,8 +50,12 @@ class MongoDBHandler extends AbstractProcessingHandler { if ($this->mongoCollection instanceof \MongoDB\Collection) { $this->mongoCollection->insertOne($record["formatted"]); - } else { + } else if($this->mongoCollection instanceof \MongoCollection) { $this->mongoCollection->insert($record["formatted"]); + } else { + $bulk = new \MongoDB\Driver\BulkWrite(); + $bulk->insert($record["formatted"]); + $this->$manager->executeBulkWrite($this->namespace, $bulk); } } diff --git a/tests/Monolog/Handler/MongoDBHandlerTest.php b/tests/Monolog/Handler/MongoDBHandlerTest.php index 0fdef63a..5c05e901 100644 --- a/tests/Monolog/Handler/MongoDBHandlerTest.php +++ b/tests/Monolog/Handler/MongoDBHandlerTest.php @@ -27,7 +27,7 @@ class MongoDBHandlerTest extends TestCase public function testHandle() { $mongo = $this->getMock('Mongo', array('selectCollection'), array(), '', false); - $collection = $this->getMock('stdClass', array('save')); + $collection = $this->getMock('stdClass', array('insert')); $mongo->expects($this->once()) ->method('selectCollection') @@ -47,12 +47,45 @@ class MongoDBHandlerTest extends TestCase ); $collection->expects($this->once()) - ->method('save') + ->method('insert') ->with($expected); $handler = new MongoDBHandler($mongo, 'DB', 'Collection'); $handler->handle($record); } + + public function testHandleWithManager() { + if (!(class_exists('MongoDB\Driver\Manager'))) { + $this->markTestSkipped('mongo extension not installed'); + } + + $manager = $this->getMock('MongoDB\Driver\Manager', array('executeBulkWrite'), array(), '', false); + + + $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); + $expected = array( + 'message' => 'test', + 'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34), + 'level' => Logger::WARNING, + 'level_name' => 'WARNING', + 'channel' => 'test', + 'datetime' => $record['datetime']->format('Y-m-d H:i:s'), + 'extra' => array(), + ); + + $bulk = new \MongoDB\Driver\BulkWrite(); + $bulk->insert($expected); + + $manager->expects($this->once()) + ->method('executeBulkWrite') + ->with('DB.Collection', $bulk); + + + $handler = new MongoDBHandler($manager, 'DB', 'Collection'); + $handler->handle($record); + + } + } if (!class_exists('Mongo')) { From d860b763cb0419930e9bce71cec7408f215d5a6d Mon Sep 17 00:00:00 2001 From: Will Banfield Date: Wed, 20 Jan 2016 16:21:36 -0500 Subject: [PATCH 3/6] Response to CR comments --- src/Monolog/Handler/MongoDBHandler.php | 53 +++++++++++++++++++------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/src/Monolog/Handler/MongoDBHandler.php b/src/Monolog/Handler/MongoDBHandler.php index 15a24569..de40ef5d 100644 --- a/src/Monolog/Handler/MongoDBHandler.php +++ b/src/Monolog/Handler/MongoDBHandler.php @@ -13,6 +13,10 @@ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\NormalizerFormatter; +use MongoDB\Driver\Manager; +use MongoDB\Client; +//use Mongo; +use MongoClient; /** * Logs to a MongoDB database. @@ -23,22 +27,37 @@ use Monolog\Formatter\NormalizerFormatter; * $mongodb = new MongoDBHandler(new \Mongo("mongodb://localhost:27017"), "logs", "prod"); * $log->pushHandler($mongodb); * + * The above examples uses the MongoDB PHP library's client class; however, + * classes from ext-mongodb (MongoDB\Driver\Manager) and ext-mongo (Mongo and + * MongoClient) are also supported. + * * @author Thomas Tourlourat */ class MongoDBHandler extends AbstractProcessingHandler { - protected $mongoCollection; - protected $namespace; - protected $manager; + private $mongoCollection; + private $namespace; + private $manager; + + /** + * Constructor. + * + * @param Client|Manager|Mongo|MongoClient $mongo MongoDB driver or library instance + * @param string $database Database name + * @param string $collection Collection name + * @param int $level The minimum logging level at which this handler will be triggered + * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + */ public function __construct($mongo, $database, $collection, $level = Logger::DEBUG, $bubble = true) { - if (!($mongo instanceof \MongoClient || $mongo instanceof \Mongo || $mongo instanceof \MongoDB\Client || $mongo instanceof \MongoDB\Driver\Manager)) { + if (!($mongo instanceof MongoClient || $mongo instanceof \Mongo || $mongo instanceof MongoDB\Client || $mongo instanceof Manager)) { throw new \InvalidArgumentException('MongoClient, Mongo or MongoDB\Client instance required'); } - $this->namespace = "$database.$collection"; - if($mongo instanceof \MongoDB\Driver\Manger) { + + if ($mongo instanceof Manger) { $this->manager = $mongo; + $this->namespace = $database . '.' . $collection; } else { $this->mongoCollection = $mongo->selectCollection($database, $collection); } @@ -48,15 +67,23 @@ class MongoDBHandler extends AbstractProcessingHandler protected function write(array $record) { - if ($this->mongoCollection instanceof \MongoDB\Collection) { + if ($this->mongoCollection instanceof Collection) { $this->mongoCollection->insertOne($record["formatted"]); - } else if($this->mongoCollection instanceof \MongoCollection) { - $this->mongoCollection->insert($record["formatted"]); - } else { - $bulk = new \MongoDB\Driver\BulkWrite(); - $bulk->insert($record["formatted"]); - $this->$manager->executeBulkWrite($this->namespace, $bulk); + + return; } + + if ($this->mongoCollection instanceof MongoCollection) { + $this->mongoCollection->insert($record["formatted"]); + + return; + } + + // $this->manager instanceof \MongoDB\Driver\Manager + $bulk = new BulkWrite(); + $bulk->insert($record["formatted"]); + $this->$manager->executeBulkWrite($this->namespace, $bulk); + } /** From aa6ab660bdb32f4568514ad8ed0167b86a57809b Mon Sep 17 00:00:00 2001 From: Jeremy Mikola Date: Thu, 21 Jan 2016 15:58:45 -0500 Subject: [PATCH 4/6] MongoDBHandler only supports ext-mongodb and mongodb/mongodb The legacy driver (i.e. ext-mongo) is not supported on PHP 7, so there is no reason to leave behind its supporting code. --- composer.json | 4 +- src/Monolog/Handler/MongoDBHandler.php | 72 ++++++--------- tests/Monolog/Handler/MongoDBHandlerTest.php | 96 ++++++++------------ 3 files changed, 70 insertions(+), 102 deletions(-) diff --git a/composer.json b/composer.json index 8c9e3b8a..060dd9cb 100644 --- a/composer.json +++ b/composer.json @@ -35,8 +35,8 @@ "ruflin/elastica": "Allow sending log messages to an Elastic Search server", "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", "rollbar/rollbar": "Allow sending log messages to Rollbar", "php-console/php-console": "Allow sending log messages to Google Chrome" diff --git a/src/Monolog/Handler/MongoDBHandler.php b/src/Monolog/Handler/MongoDBHandler.php index de40ef5d..15f6c882 100644 --- a/src/Monolog/Handler/MongoDBHandler.php +++ b/src/Monolog/Handler/MongoDBHandler.php @@ -11,55 +11,51 @@ namespace Monolog\Handler; -use Monolog\Logger; -use Monolog\Formatter\NormalizerFormatter; +use MongoDB\Driver\BulkWrite; use MongoDB\Driver\Manager; use MongoDB\Client; -//use Mongo; -use MongoClient; +use Monolog\Logger; +use Monolog\Formatter\NormalizerFormatter; /** * Logs to a MongoDB database. * - * usage example: + * Usage example: * - * $log = new Logger('application'); - * $mongodb = new MongoDBHandler(new \Mongo("mongodb://localhost:27017"), "logs", "prod"); + * $log = new \Monolog\Logger('application'); + * $client = new \MongoDB\Client('mongodb://localhost:27017'); + * $mongodb = new \Monolog\Handler\MongoDBHandler($client, 'logs', 'prod'); * $log->pushHandler($mongodb); * - * The above examples uses the MongoDB PHP library's client class; however, - * classes from ext-mongodb (MongoDB\Driver\Manager) and ext-mongo (Mongo and - * MongoClient) are also supported. - * - * @author Thomas Tourlourat + * The above examples uses the MongoDB PHP library's client class; however, the + * MongoDB\Driver\Manager class from ext-mongodb is also supported. */ class MongoDBHandler extends AbstractProcessingHandler { - private $mongoCollection; - private $namespace; + private $collection; private $manager; - + private $namespace; /** * Constructor. * - * @param Client|Manager|Mongo|MongoClient $mongo MongoDB driver or library instance - * @param string $database Database name - * @param string $collection Collection name - * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param Client|Manager $mongodb MongoDB library or driver client + * @param string $database Database name + * @param string $collection Collection name + * @param int $level The minimum logging level at which this handler will be triggered + * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ - public function __construct($mongo, $database, $collection, $level = Logger::DEBUG, $bubble = true) + public function __construct($mongodb, $database, $collection, $level = Logger::DEBUG, $bubble = true) { - if (!($mongo instanceof MongoClient || $mongo instanceof \Mongo || $mongo instanceof MongoDB\Client || $mongo instanceof Manager)) { - throw new \InvalidArgumentException('MongoClient, Mongo or MongoDB\Client instance required'); + if (!($mongodb instanceof Client || $mongodb instanceof Manager)) { + throw new \InvalidArgumentException('MongoDB\Client or MongoDB\Driver\Manager instance required'); } - if ($mongo instanceof Manger) { - $this->manager = $mongo; - $this->namespace = $database . '.' . $collection; + if ($mongodb instanceof Client) { + $this->collection = $mongodb->selectCollection($database, $collection); } else { - $this->mongoCollection = $mongo->selectCollection($database, $collection); + $this->manager = $mongodb; + $this->namespace = $database . '.' . $collection; } parent::__construct($level, $bubble); @@ -67,23 +63,15 @@ class MongoDBHandler extends AbstractProcessingHandler protected function write(array $record) { - if ($this->mongoCollection instanceof Collection) { - $this->mongoCollection->insertOne($record["formatted"]); - - return; + if (isset($this->collection)) { + $this->collection->insertOne($record['formatted']); } - if ($this->mongoCollection instanceof MongoCollection) { - $this->mongoCollection->insert($record["formatted"]); - - return; + if (isset($this->manager, $this->namespace)) { + $bulk = new BulkWrite; + $bulk->insert($record["formatted"]); + $this->manager->executeBulkWrite($this->namespace, $bulk); } - - // $this->manager instanceof \MongoDB\Driver\Manager - $bulk = new BulkWrite(); - $bulk->insert($record["formatted"]); - $this->$manager->executeBulkWrite($this->namespace, $bulk); - } /** @@ -91,6 +79,6 @@ class MongoDBHandler extends AbstractProcessingHandler */ protected function getDefaultFormatter() { - return new NormalizerFormatter(); + return new NormalizerFormatter; } } diff --git a/tests/Monolog/Handler/MongoDBHandlerTest.php b/tests/Monolog/Handler/MongoDBHandlerTest.php index 5c05e901..5d6d59dc 100644 --- a/tests/Monolog/Handler/MongoDBHandlerTest.php +++ b/tests/Monolog/Handler/MongoDBHandlerTest.php @@ -11,8 +11,9 @@ namespace Monolog\Handler; +use MongoDB\Driver\Manager; use Monolog\TestCase; -use Monolog\Logger; +use Monolog\Formatter\NormalizerFormatter; class MongoDBHandlerTest extends TestCase { @@ -21,78 +22,57 @@ class MongoDBHandlerTest extends TestCase */ public function testConstructorShouldThrowExceptionForInvalidMongo() { - new MongoDBHandler(new \stdClass(), 'DB', 'Collection'); + new MongoDBHandler(new \stdClass, 'db', 'collection'); } - public function testHandle() + public function testHandleWithLibraryClient() { - $mongo = $this->getMock('Mongo', array('selectCollection'), array(), '', false); - $collection = $this->getMock('stdClass', array('insert')); + if (!(class_exists('MongoDB\Client'))) { + $this->markTestSkipped('mongodb/mongodb not installed'); + } - $mongo->expects($this->once()) + $mongodb = $this->getMockBuilder('MongoDB\Client') + ->disableOriginalConstructor() + ->getMock(); + + $collection = $this->getMockBuilder('MongoDB\Collection') + ->disableOriginalConstructor() + ->getMock(); + + $mongodb->expects($this->once()) ->method('selectCollection') - ->with('DB', 'Collection') + ->with('db', 'collection') ->will($this->returnValue($collection)); - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $expected = array( - 'message' => 'test', - 'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34), - 'level' => Logger::WARNING, - 'level_name' => 'WARNING', - 'channel' => 'test', - 'datetime' => $record['datetime']->format('Y-m-d H:i:s'), - 'extra' => array(), - ); + $record = $this->getRecord(); + $expected = $record; + $expected['datetime'] = $record['datetime']->format(NormalizerFormatter::SIMPLE_DATE); $collection->expects($this->once()) - ->method('insert') + ->method('insertOne') ->with($expected); - $handler = new MongoDBHandler($mongo, 'DB', 'Collection'); + $handler = new MongoDBHandler($mongodb, 'db', 'collection'); $handler->handle($record); } - public function testHandleWithManager() { - if (!(class_exists('MongoDB\Driver\Manager'))) { - $this->markTestSkipped('mongo extension not installed'); - } - - $manager = $this->getMock('MongoDB\Driver\Manager', array('executeBulkWrite'), array(), '', false); - - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - $expected = array( - 'message' => 'test', - 'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34), - 'level' => Logger::WARNING, - 'level_name' => 'WARNING', - 'channel' => 'test', - 'datetime' => $record['datetime']->format('Y-m-d H:i:s'), - 'extra' => array(), - ); - - $bulk = new \MongoDB\Driver\BulkWrite(); - $bulk->insert($expected); - - $manager->expects($this->once()) - ->method('executeBulkWrite') - ->with('DB.Collection', $bulk); - - - $handler = new MongoDBHandler($manager, 'DB', 'Collection'); - $handler->handle($record); - - } - -} - -if (!class_exists('Mongo')) { - class Mongo + public function testHandleWithDriverManager() { - public function selectCollection() - { + if (!(class_exists('MongoDB\Driver\Manager'))) { + $this->markTestSkipped('ext-mongodb not installed'); + } + + /* This can become a unit test once ManagerInterface can be mocked. + * See: https://jira.mongodb.org/browse/PHPC-378 + */ + $mongodb = new Manager('mongodb://localhost:27017'); + $handler = new MongoDBHandler($mongodb, 'test', 'monolog'); + $record = $this->getRecord(); + + try { + $handler->handle($record); + } catch (\RuntimeException $e) { + $this->markTestSkipped('Could not connect to MongoDB server on mongodb://localhost:27017'); } } } From f585e714fcc225511344aa50026c1182974530ae Mon Sep 17 00:00:00 2001 From: Jeremy Mikola Date: Thu, 21 Jan 2016 16:22:47 -0500 Subject: [PATCH 5/6] Support ext-mongodb's UTCDateTime class in MongoDBFormatter The legacy driver (i.e. ext-mongo) and MongoDate are not supported on PHP 7. --- src/Monolog/Formatter/MongoDBFormatter.php | 11 +++++++- .../Formatter/MongoDBFormatterTest.php | 27 ++++++++++--------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/Monolog/Formatter/MongoDBFormatter.php b/src/Monolog/Formatter/MongoDBFormatter.php index eb067bb7..fb211f17 100644 --- a/src/Monolog/Formatter/MongoDBFormatter.php +++ b/src/Monolog/Formatter/MongoDBFormatter.php @@ -11,6 +11,8 @@ namespace Monolog\Formatter; +use MongoDB\BSON\UTCDateTime; + /** * Formats a record for use with the MongoDBHandler. * @@ -100,6 +102,13 @@ class MongoDBFormatter implements FormatterInterface protected function formatDate(\DateTime $value, $nestingLevel) { - return new \MongoDate($value->getTimestamp()); + $seconds = (int) $value->format('U'); + $milliseconds = (int) $value->format('u') / 1000; + + if ($seconds < 0) { + return new UTCDateTime($seconds * 1000 - $milliseconds); + } else { + return new UTCDateTime($seconds * 1000 + $milliseconds); + } } } diff --git a/tests/Monolog/Formatter/MongoDBFormatterTest.php b/tests/Monolog/Formatter/MongoDBFormatterTest.php index 52e699e0..273e877c 100644 --- a/tests/Monolog/Formatter/MongoDBFormatterTest.php +++ b/tests/Monolog/Formatter/MongoDBFormatterTest.php @@ -20,8 +20,8 @@ class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase { public function setUp() { - if (!class_exists('MongoDate')) { - $this->markTestSkipped('mongo extension not installed'); + if (!class_exists('MongoDB\BSON\UTCDateTime')) { + $this->markTestSkipped('ext-mongodb not installed'); } } @@ -62,7 +62,7 @@ class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', - 'datetime' => new \DateTime('2014-02-01 00:00:00'), + 'datetime' => new \DateTime('2016-01-21T21:11:30.123456+00:00'), 'extra' => array(), ); @@ -75,8 +75,8 @@ class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase $this->assertEquals(Logger::WARNING, $formattedRecord['level']); $this->assertEquals(Logger::getLevelName(Logger::WARNING), $formattedRecord['level_name']); $this->assertEquals('test', $formattedRecord['channel']); - $this->assertInstanceOf('\MongoDate', $formattedRecord['datetime']); - $this->assertEquals('0.00000000 1391212800', $formattedRecord['datetime']->__toString()); + $this->assertInstanceOf('MongoDB\BSON\UTCDateTime', $formattedRecord['datetime']); + $this->assertEquals('1453410690123', $formattedRecord['datetime']->__toString()); $this->assertEquals(array(), $formattedRecord['extra']); } @@ -89,7 +89,7 @@ class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase $record = array( 'message' => 'some log message', 'context' => array( - 'stuff' => new \DateTime('2014-02-01 02:31:33'), + 'stuff' => new \DateTime('1969-01-21T21:11:30.123456+00:00'), 'some_object' => $someObject, 'context_string' => 'some string', 'context_int' => 123456, @@ -98,7 +98,7 @@ class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', - 'datetime' => new \DateTime('2014-02-01 00:00:00'), + 'datetime' => new \DateTime('2016-01-21T21:11:30.123456+00:00'), 'extra' => array(), ); @@ -106,8 +106,9 @@ class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase $formattedRecord = $formatter->format($record); $this->assertCount(5, $formattedRecord['context']); - $this->assertInstanceOf('\MongoDate', $formattedRecord['context']['stuff']); - $this->assertEquals('0.00000000 1391221893', $formattedRecord['context']['stuff']->__toString()); + $this->assertInstanceOf('MongoDB\BSON\UTCDateTime', $formattedRecord['context']['stuff']); + $this->assertEquals('-29731710123', $formattedRecord['context']['stuff']->__toString()); + $this->assertEquals( array( 'foo' => 'something', @@ -144,7 +145,7 @@ class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', - 'datetime' => new \DateTime('2014-02-01 00:00:00'), + 'datetime' => new \DateTime('2016-01-21T21:11:30.123456+00:00'), 'extra' => array(), ); @@ -180,7 +181,7 @@ class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', - 'datetime' => new \DateTime('2014-02-01 00:00:00'), + 'datetime' => new \DateTime('2016-01-21T21:11:30.123456+00:00'), 'extra' => array(), ); @@ -219,7 +220,7 @@ class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', - 'datetime' => new \DateTime('2014-02-01 00:00:00'), + 'datetime' => new \DateTime('2016-01-21T21:11:30.123456+00:00'), 'extra' => array(), ); @@ -248,7 +249,7 @@ class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', - 'datetime' => new \DateTime('2014-02-01 00:00:00'), + 'datetime' => new \DateTime('2016-01-21T21:11:30.123456+00:00'), 'extra' => array(), ); From e9ea22ffeba635474f34b09dc8cbc3e3bb5a1adc Mon Sep 17 00:00:00 2001 From: Mark Garrett Date: Fri, 19 Feb 2016 17:33:40 -0600 Subject: [PATCH 6/6] Update to use more generic interfaces PHP 7 can throw Errors and Exceptions, so use `Throwable` interface. `DateTimeInterface` allows for both `DateTime` and `DateTimeImmutable`. --- src/Monolog/Formatter/MongoDBFormatter.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Monolog/Formatter/MongoDBFormatter.php b/src/Monolog/Formatter/MongoDBFormatter.php index fb211f17..d40da1f8 100644 --- a/src/Monolog/Formatter/MongoDBFormatter.php +++ b/src/Monolog/Formatter/MongoDBFormatter.php @@ -57,9 +57,9 @@ class MongoDBFormatter implements FormatterInterface { if ($this->maxNestingLevel == 0 || $nestingLevel <= $this->maxNestingLevel) { foreach ($record as $name => $value) { - if ($value instanceof \DateTime) { + if ($value instanceof \DateTimeInterface) { $record[$name] = $this->formatDate($value, $nestingLevel + 1); - } elseif ($value instanceof \Exception) { + } elseif ($value instanceof \Throwable) { $record[$name] = $this->formatException($value, $nestingLevel + 1); } elseif (is_array($value)) { $record[$name] = $this->formatArray($value, $nestingLevel + 1); @@ -82,7 +82,7 @@ class MongoDBFormatter implements FormatterInterface return $this->formatArray($objectVars, $nestingLevel); } - protected function formatException(\Exception $exception, $nestingLevel) + protected function formatException(\Throwable $exception, $nestingLevel) { $formattedException = array( 'class' => get_class($exception), @@ -100,7 +100,7 @@ class MongoDBFormatter implements FormatterInterface return $this->formatArray($formattedException, $nestingLevel); } - protected function formatDate(\DateTime $value, $nestingLevel) + protected function formatDate(\DateTimeInterface $value, $nestingLevel) { $seconds = (int) $value->format('U'); $milliseconds = (int) $value->format('u') / 1000;