Merge "Improve logging of exceptions which are not thrown but attached to context"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 24 Feb 2017 12:04:19 +0000 (12:04 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 24 Feb 2017 12:04:20 +0000 (12:04 +0000)
includes/debug/logger/monolog/LogstashFormatter.php

index 553cbf6..09ed755 100644 (file)
@@ -6,6 +6,7 @@ namespace MediaWiki\Logger\Monolog;
  * LogstashFormatter squashes the base message array and the context and extras subarrays into one.
  * This can result in unfortunately named context fields overwriting other data (T145133).
  * This class modifies the standard LogstashFormatter to rename such fields and flag the message.
+ * Also changes exception JSON-ification which is done poorly by the standard class.
  *
  * Compatible with Monolog 1.x only.
  *
@@ -80,4 +81,31 @@ class LogstashFormatter extends \Monolog\Formatter\LogstashFormatter {
                }
                return $fields;
        }
+
+       /**
+        * Use a more user-friendly trace format than NormalizerFormatter
+        * @param \Exception|\Throwable $e
+        * @return array
+        */
+       protected function normalizeException( $e ) {
+               if ( !$e instanceof \Exception && !$e instanceof \Throwable ) {
+                       throw new \InvalidArgumentException( 'Exception/Throwable expected, got '
+                               . gettype( $e ) . ' / ' . get_class( $e ) );
+               }
+
+               $data = [
+                       'class' => get_class( $e ),
+                       'message' => $e->getMessage(),
+                       'code' => $e->getCode(),
+                       'file' => $e->getFile() . ':' . $e->getLine(),
+                       'trace' => \MWExceptionHandler::getRedactedTraceAsString( $e ),
+               ];
+
+               $previous = $e->getPrevious();
+               if ( $previous ) {
+                       $data['previous'] = $this->normalizeException( $previous );
+               }
+
+               return $data;
+       }
 }