1
0
mirror of https://github.com/Seldaek/monolog.git synced 2025-08-05 12:47:39 +02:00

Fix displaying anonymous classes

This commit is contained in:
Nicolas Grekas
2018-08-17 09:54:55 +02:00
parent c465e11445
commit 9117a6c747
7 changed files with 32 additions and 13 deletions

View File

@@ -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)
); );

View File

@@ -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(),

View File

@@ -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";
} }

View File

@@ -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(),

View File

@@ -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;

View File

@@ -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).']';
} }

View File

@@ -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;
}
} }