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

LogstashFormatter: format context and extra fields as JSON objects (#976)

BC Break
* For Logstash, format context as object instead of individual fields
* For Logstash, format extra as object instead of individual fields
Elnur Abdurrakhimov 8 лет назад
Родитель
Сommit
91a0f40927

+ 2 - 6
src/Monolog/Formatter/LogstashFormatter.php

@@ -90,14 +90,10 @@ class LogstashFormatter extends NormalizerFormatter
             $message['type'] = $this->applicationName;
         }
         if (!empty($record['extra'])) {
-            foreach ($record['extra'] as $key => $val) {
-                $message[$this->extraPrefix . $key] = $val;
-            }
+            $message[$this->extraPrefix.'extra'] = $record['extra'];
         }
         if (!empty($record['context'])) {
-            foreach ($record['context'] as $key => $val) {
-                $message[$this->contextPrefix . $key] = $val;
-            }
+            $message[$this->contextPrefix.'context'] = $record['context'];
         }
 
         return $this->toJson($message) . "\n";

+ 15 - 11
tests/Monolog/Formatter/LogstashFormatterTest.php

@@ -74,8 +74,8 @@ class LogstashFormatterTest extends \PHPUnit\Framework\TestCase
 
         $message = json_decode($formatter->format($record), true);
 
-        $this->assertEquals('test', $message['file']);
-        $this->assertEquals(14, $message['line']);
+        $this->assertEquals('test', $message['extra']['file']);
+        $this->assertEquals(14, $message['extra']['line']);
     }
 
     /**
@@ -96,15 +96,17 @@ class LogstashFormatterTest extends \PHPUnit\Framework\TestCase
 
         $message = json_decode($formatter->format($record), true);
 
-        $this->assertArrayHasKey('ctxt_from', $message);
-        $this->assertEquals('logger', $message['ctxt_from']);
+        $this->assertArrayHasKey('ctxt_context', $message);
+        $this->assertArrayHasKey('from', $message['ctxt_context']);
+        $this->assertEquals('logger', $message['ctxt_context']['from']);
 
         // Test with extraPrefix
         $formatter = new LogstashFormatter('test', null, null, 'CTX');
         $message = json_decode($formatter->format($record), true);
 
-        $this->assertArrayHasKey('CTXfrom', $message);
-        $this->assertEquals('logger', $message['CTXfrom']);
+        $this->assertArrayHasKey('CTXcontext', $message);
+        $this->assertArrayHasKey('from', $message['CTXcontext']);
+        $this->assertEquals('logger', $message['CTXcontext']['from']);
     }
 
     /**
@@ -125,15 +127,17 @@ class LogstashFormatterTest extends \PHPUnit\Framework\TestCase
 
         $message = json_decode($formatter->format($record), true);
 
-        $this->assertArrayHasKey('key', $message);
-        $this->assertEquals('pair', $message['key']);
+        $this->assertArrayHasKey('extra', $message);
+        $this->assertArrayHasKey('key', $message['extra']);
+        $this->assertEquals('pair', $message['extra']['key']);
 
         // Test with extraPrefix
         $formatter = new LogstashFormatter('test', null, 'EXT', 'ctxt_');
         $message = json_decode($formatter->format($record), true);
 
-        $this->assertArrayHasKey('EXTkey', $message);
-        $this->assertEquals('pair', $message['EXTkey']);
+        $this->assertArrayHasKey('EXTextra', $message);
+        $this->assertArrayHasKey('key', $message['EXTextra']);
+        $this->assertEquals('pair', $message['EXTextra']['key']);
     }
 
     public function testFormatWithApplicationNameV1()
@@ -178,6 +182,6 @@ class LogstashFormatterTest extends \PHPUnit\Framework\TestCase
         $this->assertEquals('ERROR', $message['level']);
         $this->assertEquals('test', $message['type']);
         $this->assertEquals('hostname', $message['host']);
-        $this->assertEquals('ÖWN; FBCR/OrangeEspaña; Versão/4.0; Färist', $message['user_agent']);
+        $this->assertEquals('ÖWN; FBCR/OrangeEspaña; Versão/4.0; Färist', $message['extra']['user_agent']);
     }
 }