From b0e5c8b2f6541b1de8eca68930a506ad5a24baaa Mon Sep 17 00:00:00 2001 From: Paul Klimov Date: Tue, 18 Jul 2023 15:34:27 +0300 Subject: [PATCH] create `PsrLogger` --- src/AbstractPsrLogger.php | 76 +++++++++++++++++++++++++++ src/Logger.php | 4 ++ src/PsrLogger.php | 33 ++++++++++++ tests/PsrLoggerTest.php | 58 ++++++++++++++++++++ tests/support/AbstractArrayLogger.php | 2 +- tests/support/ArrayLogger.php | 4 +- 6 files changed, 174 insertions(+), 3 deletions(-) create mode 100644 src/AbstractPsrLogger.php create mode 100644 src/PsrLogger.php create mode 100644 tests/PsrLoggerTest.php diff --git a/src/AbstractPsrLogger.php b/src/AbstractPsrLogger.php new file mode 100644 index 0000000..eedb187 --- /dev/null +++ b/src/AbstractPsrLogger.php @@ -0,0 +1,76 @@ + + * @since 1.0 + */ +abstract class AbstractPsrLogger implements LoggerInterface +{ + use LoggerTrait; + + /** + * @var \CLogger|null Yii logger to write logs into. + */ + private $_yiiLogger; + + /** + * @return \CLogger Yii logger instance. + */ + public function getYiiLogger(): CLogger + { + if ($this->_yiiLogger === null) { + $this->_yiiLogger = Yii::getLogger(); + } + + return $this->_yiiLogger; + } + + /** + * @param \CLogger|null $yiiLogger Yii logger instance to be used. + * @return static self reference. + */ + public function setYiiLogger(?CLogger $yiiLogger): self + { + $this->_yiiLogger = $yiiLogger; + + return $this; + } + + /** + * Logs with an arbitrary level. + * This method should be invoked during {@see log()} method implementation. + * + * @param mixed $level log level. + * @param string|\Stringable $message log message. + * @param array $context log context. + * @return void + */ + protected function writeLog($level, $message, array $context = []): void + { + $yiiLogger = $this->getYiiLogger(); + + if (!$yiiLogger instanceof Logger) { + $context = $context['category'] ?? 'application'; + } + + $yiiLogger->log( + $message, + LogLevelConverter::toYii($level), + $context + ); + } +} \ No newline at end of file diff --git a/src/Logger.php b/src/Logger.php index aefcf9f..e5fffa9 100644 --- a/src/Logger.php +++ b/src/Logger.php @@ -7,6 +7,10 @@ use Yii; /** + * Logger is an enhanced version of Yii standard {@see \CLogger}, which allows passing messages to the wrapped PSR logger. + * + * This class can be used in case you with to utilize 3rd party PSR logger library like "Monolog" in your Yii application. + * * @property \Psr\Log\LoggerInterface|string|array|null $psrLogger related PSR logger. * * @author Paul Klimov diff --git a/src/PsrLogger.php b/src/PsrLogger.php new file mode 100644 index 0000000..a63e33a --- /dev/null +++ b/src/PsrLogger.php @@ -0,0 +1,33 @@ +=')) { + /** + * {@inheritdoc} + */ + class PsrLogger extends AbstractPsrLogger + { + /** + * {@inheritdoc} + */ + public function log($level, string|\Stringable $message, array $context = []): void + { + $this->writeLog($level, $message, $context); + } + } +} else { + /** + * {@inheritdoc} + */ + class PsrLogger extends AbstractPsrLogger + { + /** + * {@inheritdoc} + */ + public function log($level, $message, array $context = []): void + { + $this->writeLog($level, $message, $context); + } + } +} \ No newline at end of file diff --git a/tests/PsrLoggerTest.php b/tests/PsrLoggerTest.php new file mode 100644 index 0000000..be7a78a --- /dev/null +++ b/tests/PsrLoggerTest.php @@ -0,0 +1,58 @@ +setYiiLogger($yiiLogger); + + $this->assertSame($yiiLogger, $psrLogger->getYiiLogger()); + } + + public function testGetDefaultYiiLogger(): void + { + $psrLogger = new PsrLogger(); + + $yiiLogger = $psrLogger->getYiiLogger(); + + $this->assertTrue($yiiLogger instanceof CLogger); + $this->assertSame($yiiLogger, Yii::getLogger()); + } + + public function testWriteLog(): void + { + $yiiLogger = new CLogger(); + + $logger = (new PsrLogger()) + ->setYiiLogger($yiiLogger); + + $logger->log(LogLevel::INFO, 'test message', ['category' => 'context-category']); + + $logs = $yiiLogger->getLogs(); + $yiiLogger->flush(); + + $this->assertFalse(empty($logs[0])); + $this->assertSame('test message', $logs[0][0]); + $this->assertSame(LogLevel::INFO, $logs[0][1]); + $this->assertSame('context-category', $logs[0][2]); + + $logger->log(LogLevel::INFO, 'test message', ['foo' => 'bar']); + + $logs = $yiiLogger->getLogs(); + $yiiLogger->flush(); + + $this->assertFalse(empty($logs[0])); + $this->assertSame('application', $logs[0][2]); + } +} \ No newline at end of file diff --git a/tests/support/AbstractArrayLogger.php b/tests/support/AbstractArrayLogger.php index 330d322..afef026 100644 --- a/tests/support/AbstractArrayLogger.php +++ b/tests/support/AbstractArrayLogger.php @@ -19,7 +19,7 @@ abstract class AbstractArrayLogger implements LoggerInterface */ public $logs = []; - protected function baseLog($level, $message, array $context = []): void + protected function writeLog($level, $message, array $context = []): void { $this->logs[] = [ 'level' => $level, diff --git a/tests/support/ArrayLogger.php b/tests/support/ArrayLogger.php index 6a297f9..1a48638 100644 --- a/tests/support/ArrayLogger.php +++ b/tests/support/ArrayLogger.php @@ -7,7 +7,7 @@ class ArrayLogger extends AbstractArrayLogger { public function log($level, string|\Stringable $message, array $context = []): void { - $this->baseLog($level, $message, $context); + $this->writeLog($level, $message, $context); } } } else { @@ -15,7 +15,7 @@ class ArrayLogger extends AbstractArrayLogger { public function log($level, $message, array $context = []): void { - $this->baseLog($level, $message, $context); + $this->writeLog($level, $message, $context); } } } \ No newline at end of file