From fab81d28bccb2cb4a972ca29de2d54113417cf1c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 9 Jan 2020 20:44:21 +0000 Subject: [PATCH 1/3] MainLogger: always log exceptions with CRITICAL level if we reached this point, it's almost always due to a general exception handler which doesn't know what else to do with the error. --- src/pocketmine/utils/MainLogger.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/pocketmine/utils/MainLogger.php b/src/pocketmine/utils/MainLogger.php index 4e278116a..04d8115de 100644 --- a/src/pocketmine/utils/MainLogger.php +++ b/src/pocketmine/utils/MainLogger.php @@ -227,11 +227,7 @@ class MainLogger extends \AttachableThreadedLogger{ E_DEPRECATED => "E_DEPRECATED", E_USER_DEPRECATED => "E_USER_DEPRECATED" ]; - if($errno === 0){ - $type = LogLevel::CRITICAL; - }else{ - $type = ($errno === E_ERROR or $errno === E_USER_ERROR) ? LogLevel::ERROR : (($errno === E_USER_WARNING or $errno === E_WARNING) ? LogLevel::WARNING : LogLevel::NOTICE); - } + $errno = $errorConversion[$errno] ?? $errno; $errstr = preg_replace('/\s+/', ' ', trim($errstr)); $errfile = Utils::cleanPath($errfile); @@ -239,8 +235,8 @@ class MainLogger extends \AttachableThreadedLogger{ $message = get_class($e) . ": \"$errstr\" ($errno) in \"$errfile\" at line $errline"; $stack = Utils::printableTrace($trace); - $this->synchronized(function() use ($type, $message, $stack) : void{ - $this->log($type, $message); + $this->synchronized(function() use ($message, $stack) : void{ + $this->critical($message); foreach($stack as $line){ $this->debug($line, true); } From c4580dd56dc47bb14640f903f26d556f1739f00d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 9 Jan 2020 20:51:13 +0000 Subject: [PATCH 2/3] MainLogger: extract a printErrorMessage() function from logException() --- src/pocketmine/utils/MainLogger.php | 38 ++++++++++++++++------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/pocketmine/utils/MainLogger.php b/src/pocketmine/utils/MainLogger.php index 04d8115de..4ed9ec2b3 100644 --- a/src/pocketmine/utils/MainLogger.php +++ b/src/pocketmine/utils/MainLogger.php @@ -204,12 +204,22 @@ class MainLogger extends \AttachableThreadedLogger{ if($trace === null){ $trace = $e->getTrace(); } - $errstr = $e->getMessage(); - $errfile = $e->getFile(); - $errno = $e->getCode(); - $errline = $e->getLine(); - $errorConversion = [ + $message = self::printExceptionMessage($e); + $stack = Utils::printableTrace($trace); + + $this->synchronized(function() use ($message, $stack) : void{ + $this->critical($message); + foreach($stack as $line){ + $this->debug($line, true); + } + }); + + $this->syncFlushBuffer(); + } + + private static function printExceptionMessage(\Throwable $e) : string{ + static $errorConversion = [ 0 => "EXCEPTION", E_ERROR => "E_ERROR", E_WARNING => "E_WARNING", @@ -228,21 +238,15 @@ class MainLogger extends \AttachableThreadedLogger{ E_USER_DEPRECATED => "E_USER_DEPRECATED" ]; + $errstr = preg_replace('/\s+/', ' ', trim($e->getMessage())); + + $errno = $e->getCode(); $errno = $errorConversion[$errno] ?? $errno; - $errstr = preg_replace('/\s+/', ' ', trim($errstr)); - $errfile = Utils::cleanPath($errfile); - $message = get_class($e) . ": \"$errstr\" ($errno) in \"$errfile\" at line $errline"; - $stack = Utils::printableTrace($trace); + $errfile = Utils::cleanPath($e->getFile()); + $errline = $e->getLine(); - $this->synchronized(function() use ($message, $stack) : void{ - $this->critical($message); - foreach($stack as $line){ - $this->debug($line, true); - } - }); - - $this->syncFlushBuffer(); + return get_class($e) . ": \"$errstr\" ($errno) in \"$errfile\" at line $errline"; } public function log($level, $message){ From 0a39e580e9b33df05375ff8471c6524ce030229d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 9 Jan 2020 21:01:12 +0000 Subject: [PATCH 3/3] MainLogger: log exception chains in logException(), closes #2447 this method is simpler than #2447 and easier to apply to stable. --- src/pocketmine/utils/MainLogger.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/pocketmine/utils/MainLogger.php b/src/pocketmine/utils/MainLogger.php index 4ed9ec2b3..3ee06889b 100644 --- a/src/pocketmine/utils/MainLogger.php +++ b/src/pocketmine/utils/MainLogger.php @@ -205,14 +205,17 @@ class MainLogger extends \AttachableThreadedLogger{ $trace = $e->getTrace(); } - $message = self::printExceptionMessage($e); - $stack = Utils::printableTrace($trace); - - $this->synchronized(function() use ($message, $stack) : void{ - $this->critical($message); - foreach($stack as $line){ + $this->synchronized(function() use ($e, $trace) : void{ + $this->critical(self::printExceptionMessage($e)); + foreach(Utils::printableTrace($trace) as $line){ $this->debug($line, true); } + for($prev = $e->getPrevious(); $prev !== null; $prev = $prev->getPrevious()){ + $this->debug("Previous: " . self::printExceptionMessage($prev), true); + foreach(Utils::printableTrace($prev->getTrace()) as $line){ + $this->debug(" " . $line, true); + } + } }); $this->syncFlushBuffer();