From 943f469a108583ca0ab7def0086b5887c543ed3c Mon Sep 17 00:00:00 2001 From: macbre Date: Wed, 9 Aug 2023 15:39:10 +0100 Subject: [PATCH 1/3] NanoLogger: pushProcessor() now accepts LogRecord, not an array And add some tests coverage. Fixes: TypeError: Nano\Logger\NanoLogger::Nano\Logger\{closure}(): Argument #1 ($record) must be of type array, Monolog\LogRecord given, called in Monolog/Logger.php on line 366 --- classes/logger/NanoLogger.class.php | 20 +++++++------- tests/NanoLoggerTest.php | 41 +++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 11 deletions(-) create mode 100644 tests/NanoLoggerTest.php diff --git a/classes/logger/NanoLogger.class.php b/classes/logger/NanoLogger.class.php index 9e549233..e77cbf59 100644 --- a/classes/logger/NanoLogger.class.php +++ b/classes/logger/NanoLogger.class.php @@ -2,7 +2,9 @@ namespace Nano\Logger; +use Monolog\Handler\HandlerInterface; use Monolog\Logger; +use Monolog\LogRecord; use Monolog\Handler\RotatingFileHandler; // processors @@ -18,9 +20,9 @@ class NanoLogger /** * List of handlers defined via \Nano\Logger\NanoLogger::pushHandler * - * @var \Monolog\Handler\HandlerInterface[] + * @var HandlerInterface[] */ - private static $handlers = []; + private static array $handlers = []; /** * Return new instance of the Logger channel @@ -29,9 +31,8 @@ class NanoLogger * * @param string $name channel name * @param array $extraFields fields to be added to every message sent from this logger - * @return \Monolog\Logger */ - public static function getLogger($name, array $extraFields = []) + public static function getLogger(string $name, array $extraFields = []): Logger { $logger = new Logger($name); @@ -48,7 +49,7 @@ public static function getLogger($name, array $extraFields = []) if (!isset($_SERVER['REQUEST_URI'])) { $scriptName = rtrim(getcwd(), '/') . '/' . ltrim($_SERVER['PHP_SELF'], '/'); - $logger->pushProcessor(function (array $record) use ($scriptName) { + $logger->pushProcessor(function (LogRecord $record) use ($scriptName) { $record['extra']['script'] = $scriptName; return $record; }); @@ -56,7 +57,7 @@ public static function getLogger($name, array $extraFields = []) // add per-logger extra fields if (!empty($extraFields)) { - $logger->pushProcessor(function (array $record) use ($extraFields) { + $logger->pushProcessor(function (LogRecord $record) use ($extraFields) { $record['extra'] = array_merge($record['extra'], $extraFields); return $record; }); @@ -67,10 +68,8 @@ public static function getLogger($name, array $extraFields = []) /** * Register a new log handler - * - * @param \Monolog\Handler\HandlerInterface $handler */ - public static function pushHandler($handler) + public static function pushHandler(HandlerInterface $handler): void { self::$handlers[] = $handler; } @@ -80,9 +79,8 @@ public static function pushHandler($handler) * * @param string $dir App directory * @param string $stream log file name - * @param int $level */ - public static function pushStreamHandler($dir, $stream, $level=Logger::DEBUG) + public static function pushStreamHandler(string $dir, string $stream, int $level=Logger::DEBUG): void { $stream = sprintf('%s/logs/%s.log', $dir, $stream); diff --git a/tests/NanoLoggerTest.php b/tests/NanoLoggerTest.php new file mode 100644 index 00000000..f2a24190 --- /dev/null +++ b/tests/NanoLoggerTest.php @@ -0,0 +1,41 @@ +lastRecord = $record; + } +} + +/** + * @covers NanoLogger + */ +class NanoLoggerTest extends \Nano\NanoBaseTest +{ + public function testGetLogger(): void + { + $logger = NanoLogger::getLogger(name: __CLASS__, extraFields: ['foo'=>'bar']); + $this->assertInstanceOf(Logger::class, $logger); + $this->assertEquals(__CLASS__, $logger->getName()); + + // now, let's assert on what's getting logged + $handler = new TestLoggingHandler(ident: 'foo'); + $logger->pushHandler($handler); + + $logger->info('Message'); + $this->assertInstanceOf(LogRecord::class, $handler->lastRecord); + + $this->assertEquals(Monolog\Level::Info, $handler->lastRecord->level); + $this->assertEquals('Message', $handler->lastRecord->message); + $this->assertEquals('bar', $handler->lastRecord->extra['foo']); + } +} From 650193302be317af97c24fcb27e21b7d9d5071a0 Mon Sep 17 00:00:00 2001 From: macbre Date: Wed, 9 Aug 2023 15:43:09 +0100 Subject: [PATCH 2/3] NanoLoggerTest: fix @covers annotations --- tests/NanoLoggerTest.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/NanoLoggerTest.php b/tests/NanoLoggerTest.php index f2a24190..97081303 100644 --- a/tests/NanoLoggerTest.php +++ b/tests/NanoLoggerTest.php @@ -16,9 +16,6 @@ protected function write(LogRecord $record): void } } -/** - * @covers NanoLogger - */ class NanoLoggerTest extends \Nano\NanoBaseTest { public function testGetLogger(): void From a014e6d4c09a719a05df2b655f4793e67ad1bf2f Mon Sep 17 00:00:00 2001 From: macbre Date: Wed, 9 Aug 2023 15:48:33 +0100 Subject: [PATCH 3/3] NanoLoggerTest: assert that NanoLogger::pushHandler() does register a global handler --- tests/NanoLoggerTest.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/NanoLoggerTest.php b/tests/NanoLoggerTest.php index 97081303..b0571183 100644 --- a/tests/NanoLoggerTest.php +++ b/tests/NanoLoggerTest.php @@ -20,14 +20,15 @@ class NanoLoggerTest extends \Nano\NanoBaseTest { public function testGetLogger(): void { + // register a global logging handler for easier testing + $handler = new TestLoggingHandler(ident: 'foo'); + NanoLogger::pushHandler($handler); + $logger = NanoLogger::getLogger(name: __CLASS__, extraFields: ['foo'=>'bar']); $this->assertInstanceOf(Logger::class, $logger); $this->assertEquals(__CLASS__, $logger->getName()); // now, let's assert on what's getting logged - $handler = new TestLoggingHandler(ident: 'foo'); - $logger->pushHandler($handler); - $logger->info('Message'); $this->assertInstanceOf(LogRecord::class, $handler->lastRecord);