Jelajahi Sumber

Include extra in context in PsrHandler (#1852)

Witold Wasiczko 1 tahun lalu
induk
melakukan
35dab43e3c

+ 12 - 7
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 @@ class PsrHandler extends AbstractHandler implements FormattableHandlerInterface
             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;
     }

+ 16 - 0
tests/Monolog/Handler/PsrHandlerTest.php

@@ -60,4 +60,20 @@ class PsrHandlerTest extends TestCase
         $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));
+    }
 }