Просмотр исходного кода

Fix displaying anonymous classes

Nicolas Grekas 7 лет назад
Родитель
Сommit
9117a6c747

+ 2 - 1
src/Monolog/ErrorHandler.php

@@ -14,6 +14,7 @@ namespace Monolog;
 use Psr\Log\LoggerInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\LogLevel;
 use Psr\Log\LogLevel;
 use Monolog\Handler\AbstractHandler;
 use Monolog\Handler\AbstractHandler;
+use Monolog\Registry;
 
 
 /**
 /**
  * Monolog error handler
  * Monolog error handler
@@ -133,7 +134,7 @@ class ErrorHandler
     {
     {
         $this->logger->log(
         $this->logger->log(
             $this->uncaughtExceptionLevel === null ? LogLevel::ERROR : $this->uncaughtExceptionLevel,
             $this->uncaughtExceptionLevel === null ? LogLevel::ERROR : $this->uncaughtExceptionLevel,
-            sprintf('Uncaught Exception %s: "%s" at %s line %s', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()),
+            sprintf('Uncaught Exception %s: "%s" at %s line %s', Registry::getClass($e), $e->getMessage(), $e->getFile(), $e->getLine()),
             array('exception' => $e)
             array('exception' => $e)
         );
         );
 
 

+ 3 - 2
src/Monolog/Formatter/JsonFormatter.php

@@ -12,6 +12,7 @@
 namespace Monolog\Formatter;
 namespace Monolog\Formatter;
 
 
 use Exception;
 use Exception;
+use Monolog\Registry;
 use Throwable;
 use Throwable;
 
 
 /**
 /**
@@ -179,11 +180,11 @@ class JsonFormatter extends NormalizerFormatter
     {
     {
         // TODO 2.0 only check for Throwable
         // TODO 2.0 only check for Throwable
         if (!$e instanceof Exception && !$e instanceof Throwable) {
         if (!$e instanceof Exception && !$e instanceof Throwable) {
-            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.get_class($e));
+            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Registry::getClass($e));
         }
         }
 
 
         $data = array(
         $data = array(
-            'class' => get_class($e),
+            'class' => Registry::getClass($e),
             'message' => $e->getMessage(),
             'message' => $e->getMessage(),
             'code' => $e->getCode(),
             'code' => $e->getCode(),
             'file' => $e->getFile().':'.$e->getLine(),
             'file' => $e->getFile().':'.$e->getLine(),

+ 5 - 3
src/Monolog/Formatter/LineFormatter.php

@@ -11,6 +11,8 @@
 
 
 namespace Monolog\Formatter;
 namespace Monolog\Formatter;
 
 
+use Monolog\Registry;
+
 /**
 /**
  * Formats incoming records into a one-line string
  * Formats incoming records into a one-line string
  *
  *
@@ -129,17 +131,17 @@ class LineFormatter extends NormalizerFormatter
     {
     {
         // TODO 2.0 only check for Throwable
         // TODO 2.0 only check for Throwable
         if (!$e instanceof \Exception && !$e instanceof \Throwable) {
         if (!$e instanceof \Exception && !$e instanceof \Throwable) {
-            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.get_class($e));
+            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Registry::getClass($e));
         }
         }
 
 
         $previousText = '';
         $previousText = '';
         if ($previous = $e->getPrevious()) {
         if ($previous = $e->getPrevious()) {
             do {
             do {
-                $previousText .= ', '.get_class($previous).'(code: '.$previous->getCode().'): '.$previous->getMessage().' at '.$previous->getFile().':'.$previous->getLine();
+                $previousText .= ', '.Registry::getClass($previous).'(code: '.$previous->getCode().'): '.$previous->getMessage().' at '.$previous->getFile().':'.$previous->getLine();
             } while ($previous = $previous->getPrevious());
             } while ($previous = $previous->getPrevious());
         }
         }
 
 
-        $str = '[object] ('.get_class($e).'(code: '.$e->getCode().'): '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine().$previousText.')';
+        $str = '[object] ('.Registry::getClass($e).'(code: '.$e->getCode().'): '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine().$previousText.')';
         if ($this->includeStacktraces) {
         if ($this->includeStacktraces) {
             $str .= "\n[stacktrace]\n".$e->getTraceAsString()."\n";
             $str .= "\n[stacktrace]\n".$e->getTraceAsString()."\n";
         }
         }

+ 4 - 2
src/Monolog/Formatter/MongoDBFormatter.php

@@ -11,6 +11,8 @@
 
 
 namespace Monolog\Formatter;
 namespace Monolog\Formatter;
 
 
+use Monolog\Registry;
+
 /**
 /**
  * Formats a record for use with the MongoDBHandler.
  * Formats a record for use with the MongoDBHandler.
  *
  *
@@ -75,7 +77,7 @@ class MongoDBFormatter implements FormatterInterface
     protected function formatObject($value, $nestingLevel)
     protected function formatObject($value, $nestingLevel)
     {
     {
         $objectVars = get_object_vars($value);
         $objectVars = get_object_vars($value);
-        $objectVars['class'] = get_class($value);
+        $objectVars['class'] = Registry::getClass($value);
 
 
         return $this->formatArray($objectVars, $nestingLevel);
         return $this->formatArray($objectVars, $nestingLevel);
     }
     }
@@ -83,7 +85,7 @@ class MongoDBFormatter implements FormatterInterface
     protected function formatException(\Exception $exception, $nestingLevel)
     protected function formatException(\Exception $exception, $nestingLevel)
     {
     {
         $formattedException = array(
         $formattedException = array(
-            'class' => get_class($exception),
+            'class' => Registry::getClass($exception),
             'message' => $exception->getMessage(),
             'message' => $exception->getMessage(),
             'code' => $exception->getCode(),
             'code' => $exception->getCode(),
             'file' => $exception->getFile() . ':' . $exception->getLine(),
             'file' => $exception->getFile() . ':' . $exception->getLine(),

+ 5 - 4
src/Monolog/Formatter/NormalizerFormatter.php

@@ -12,6 +12,7 @@
 namespace Monolog\Formatter;
 namespace Monolog\Formatter;
 
 
 use Exception;
 use Exception;
+use Monolog\Registry;
 
 
 /**
 /**
  * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets
  * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets
@@ -108,7 +109,7 @@ class NormalizerFormatter implements FormatterInterface
                 $value = $this->toJson($data, true);
                 $value = $this->toJson($data, true);
             }
             }
 
 
-            return sprintf("[object] (%s: %s)", get_class($data), $value);
+            return sprintf("[object] (%s: %s)", Registry::getClass($data), $value);
         }
         }
 
 
         if (is_resource($data)) {
         if (is_resource($data)) {
@@ -122,11 +123,11 @@ class NormalizerFormatter implements FormatterInterface
     {
     {
         // TODO 2.0 only check for Throwable
         // TODO 2.0 only check for Throwable
         if (!$e instanceof Exception && !$e instanceof \Throwable) {
         if (!$e instanceof Exception && !$e instanceof \Throwable) {
-            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.get_class($e));
+            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Registry::getClass($e));
         }
         }
 
 
         $data = array(
         $data = array(
-            'class' => get_class($e),
+            'class' => Registry::getClass($e),
             'message' => $e->getMessage(),
             'message' => $e->getMessage(),
             'code' => $e->getCode(),
             'code' => $e->getCode(),
             'file' => $e->getFile().':'.$e->getLine(),
             'file' => $e->getFile().':'.$e->getLine(),
@@ -159,7 +160,7 @@ class NormalizerFormatter implements FormatterInterface
                     // as a class name to avoid any unexpected leak of sensitive information
                     // as a class name to avoid any unexpected leak of sensitive information
                     $frame['args'] = array_map(function ($arg) {
                     $frame['args'] = array_map(function ($arg) {
                         if (is_object($arg) && !($arg instanceof \DateTime || $arg instanceof \DateTimeInterface)) {
                         if (is_object($arg) && !($arg instanceof \DateTime || $arg instanceof \DateTimeInterface)) {
-                            return sprintf("[object] (%s)", get_class($arg));
+                            return sprintf("[object] (%s)", Registry::getClass($arg));
                         }
                         }
 
 
                         return $arg;
                         return $arg;

+ 3 - 1
src/Monolog/Processor/PsrLogMessageProcessor.php

@@ -11,6 +11,8 @@
 
 
 namespace Monolog\Processor;
 namespace Monolog\Processor;
 
 
+use Monolog\Registry;
+
 /**
 /**
  * Processes a record's message according to PSR-3 rules
  * Processes a record's message according to PSR-3 rules
  *
  *
@@ -35,7 +37,7 @@ class PsrLogMessageProcessor
             if (is_null($val) || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) {
             if (is_null($val) || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) {
                 $replacements['{'.$key.'}'] = $val;
                 $replacements['{'.$key.'}'] = $val;
             } elseif (is_object($val)) {
             } elseif (is_object($val)) {
-                $replacements['{'.$key.'}'] = '[object '.get_class($val).']';
+                $replacements['{'.$key.'}'] = '[object '.Registry::getClass($val).']';
             } else {
             } else {
                 $replacements['{'.$key.'}'] = '['.gettype($val).']';
                 $replacements['{'.$key.'}'] = '['.gettype($val).']';
             }
             }

+ 10 - 0
src/Monolog/Registry.php

@@ -131,4 +131,14 @@ class Registry
     {
     {
         return self::getInstance($name);
         return self::getInstance($name);
     }
     }
+
+    /**
+     * @internal
+     */
+    public function getClass($object)
+    {
+        $class = \get_class($object);
+
+        return 'c' === $class[0] && 0 === strpos($class, "class@anonymous\0") ? get_parent_class($class).'@anonymous' : $class;
+    }
 }
 }