diff --git a/src/Monolog/Handler/PsrHandler.php b/src/Monolog/Handler/PsrHandler.php index 6599a83b4..100e8e4a6 100644 --- a/src/Monolog/Handler/PsrHandler.php +++ b/src/Monolog/Handler/PsrHandler.php @@ -33,15 +33,17 @@ class PsrHandler extends AbstractHandler implements FormattableHandlerInterface protected LoggerInterface $logger; protected FormatterInterface|null $formatter = null; + private bool $includeExtra; /** * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied */ - public function __construct(LoggerInterface $logger, int|string|Level $level = Level::Debug, bool $bubble = true) + public function __construct(LoggerInterface $logger, int|string|Level $level = Level::Debug, bool $bubble = true, bool $includeExtra = false) { parent::__construct($level, $bubble); $this->logger = $logger; + $this->includeExtra = $includeExtra; } /** @@ -53,12 +55,15 @@ public function handle(LogRecord $record): bool return false; } - if ($this->formatter !== null) { - $formatted = $this->formatter->format($record); - $this->logger->log($record->level->toPsrLogLevel(), (string) $formatted, $record->context); - } else { - $this->logger->log($record->level->toPsrLogLevel(), $record->message, $record->context); - } + $message = $this->formatter !== null + ? (string) $this->formatter->format($record) + : $record->message; + + $context = $this->includeExtra + ? [...$record->extra, ...$record->context] + : $record->context; + + $this->logger->log($record->level->toPsrLogLevel(), $message, $context); return false === $this->bubble; } diff --git a/tests/Monolog/Handler/PsrHandlerTest.php b/tests/Monolog/Handler/PsrHandlerTest.php index d6fa6fb38..8a1ff25ee 100644 --- a/tests/Monolog/Handler/PsrHandlerTest.php +++ b/tests/Monolog/Handler/PsrHandlerTest.php @@ -60,4 +60,20 @@ public function testFormatter() $handler->setFormatter(new LineFormatter('dummy')); $handler->handle($this->getRecord($level, $message, context: $context, datetime: new \DateTimeImmutable())); } + + public function testIncludeExtra() + { + $message = 'Hello, world!'; + $context = ['foo' => 'bar']; + $extra = ['baz' => 'boo']; + $level = Level::Error; + + $psrLogger = $this->createMock('Psr\Log\NullLogger'); + $psrLogger->expects($this->once()) + ->method('log') + ->with($level->toPsrLogLevel(), $message, ['baz' => 'boo', 'foo' => 'bar']); + + $handler = new PsrHandler($psrLogger, includeExtra: true); + $handler->handle($this->getRecord($level, $message, context: $context, datetime: new \DateTimeImmutable(), extra: $extra)); + } }