Kaynağa Gözat

Add support for previous exceptions in LineFormatter

Jordi Boggiano 12 yıl önce
ebeveyn
işleme
642cdf620b

+ 8 - 1
src/Monolog/Formatter/LineFormatter.php

@@ -73,7 +73,14 @@ class LineFormatter extends NormalizerFormatter
         }
         }
 
 
         if ($data instanceof \Exception) {
         if ($data instanceof \Exception) {
-            return '[object] ('.get_class($data).': '.$data->getMessage().' at '.$data->getFile().':'.$data->getLine().')';
+            $previousText = '';
+            if ($previous = $data->getPrevious()) {
+                do {
+                    $previousText .= ', '.get_class($previous).': '.$previous->getMessage().' at '.$previous->getFile().':'.$previous->getLine();
+                } while ($previous = $previous->getPrevious());
+            }
+
+            return '[object] ('.get_class($data).': '.$data->getMessage().' at '.$data->getFile().':'.$data->getLine().$previousText.')';
         }
         }
 
 
         return parent::normalize($data);
         return parent::normalize($data);

+ 18 - 0
tests/Monolog/Formatter/LineFormatterTest.php

@@ -107,6 +107,24 @@ class LineFormatterTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (RuntimeException: Foo at '.substr($path, 1, -1).':'.(__LINE__-8).')"} []'."\n", $message);
         $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (RuntimeException: Foo at '.substr($path, 1, -1).':'.(__LINE__-8).')"} []'."\n", $message);
     }
     }
 
 
+    public function testDefFormatWithPreviousException()
+    {
+        $formatter = new LineFormatter(null, 'Y-m-d');
+        $previous = new \LogicException('Wut?');
+        $message = $formatter->format(array(
+            'level_name' => 'CRITICAL',
+            'channel' => 'core',
+            'context' => array('exception' => new \RuntimeException('Foo', 0, $previous)),
+            'datetime' => new \DateTime,
+            'extra' => array(),
+            'message' => 'foobar',
+        ));
+
+        $path = str_replace('\\/', '/', json_encode(__FILE__));
+
+        $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (RuntimeException: Foo at '.substr($path, 1, -1).':'.(__LINE__-8).', LogicException: Wut? at '.substr($path, 1, -1).':'.(__LINE__-12).')"} []'."\n", $message);
+    }
+
     public function testBatchFormat()
     public function testBatchFormat()
     {
     {
         $formatter = new LineFormatter(null, 'Y-m-d');
         $formatter = new LineFormatter(null, 'Y-m-d');