Fix object handling inside log arrays
authorPhilipp <admin@philipp.info>
Sun, 28 Mar 2021 19:50:32 +0000 (21:50 +0200)
committerPhilipp <admin@philipp.info>
Sun, 28 Mar 2021 19:50:32 +0000 (21:50 +0200)
src/Util/Logger/AbstractLogger.php
src/Util/Logger/StreamLogger.php
src/Util/Logger/SyslogLogger.php
tests/src/Util/Logger/AbstractLoggerTest.php

index 4d653ae..110a806 100644 (file)
@@ -103,6 +103,28 @@ abstract class AbstractLogger implements LoggerInterface
                return strtr($message, $replace);
        }
 
+       /**
+        * JSON Encodes an complete array including objects with "__toString()" methods
+        *
+        * @param array $input an Input Array to encode
+        *
+        * @return false|string The json encoded output of the array
+        */
+       protected function jsonEncodeArray(array $input)
+       {
+               $output = [];
+
+               foreach ($input as $key => $value) {
+                       if (method_exists($value, '__toString')) {
+                               $output[$key] = $value->__toString();
+                       } else {
+                               $output[$key] = $value;
+                       }
+               }
+
+               return @json_encode($output);
+       }
+
        /**
         * {@inheritdoc}
         */
index 035e7ec..5912e70 100644 (file)
@@ -161,8 +161,8 @@ class StreamLogger extends AbstractLogger
                $logMessage .= $this->channel . ' ';
                $logMessage .= '[' . strtoupper($level) . ']: ';
                $logMessage .= $this->psrInterpolate($message, $context) . ' ';
-               $logMessage .= @json_encode($context) . ' - ';
-               $logMessage .= @json_encode($record);
+               $logMessage .= $this->jsonEncodeArray($context) . ' - ';
+               $logMessage .= $this->jsonEncodeArray($record);
                $logMessage .= PHP_EOL;
 
                return $logMessage;
index 101baad..ae39ad9 100644 (file)
@@ -195,8 +195,8 @@ class SyslogLogger extends AbstractLogger
                $logMessage .= $this->channel . ' ';
                $logMessage .= '[' . $this->logToString[$level] . ']: ';
                $logMessage .= $this->psrInterpolate($message, $context) . ' ';
-               $logMessage .= @json_encode($context) . ' - ';
-               $logMessage .= @json_encode($record);
+               $logMessage .= $this->jsonEncodeArray($context) . ' - ';
+               $logMessage .= $this->jsonEncodeArray($record);
 
                return $logMessage;
        }
index 33bf235..e9f1830 100644 (file)
@@ -159,4 +159,23 @@ abstract class AbstractLoggerTest extends MockedTest
 
                self::assertContains(@json_encode($context), $text);
        }
+
+       /**
+        * Test a message with an exception
+        */
+       public function testExceptionHandling()
+       {
+               $e = new \Exception("Test String", 123);
+               $eFollowUp = new \Exception("FollowUp", 456, $e);
+
+               $assertion = $eFollowUp->__toString();
+
+               $logger = $this->getInstance();
+               $logger->alert('test', ['e' => $eFollowUp]);
+               $text = $this->getContent();
+
+               self::assertLogline($text);
+
+               self::assertContains(@json_encode($assertion), $this->getContent());
+       }
 }