Browse Source

Add JsonFormatter

Corey Taylor 4 years ago
parent
commit
bb3971f75d
2 changed files with 75 additions and 0 deletions
  1. 48 0
      src/Log/Formatter/JsonFormatter.php
  2. 27 0
      tests/TestCase/Log/Engine/ConsoleLogTest.php

+ 48 - 0
src/Log/Formatter/JsonFormatter.php

@@ -0,0 +1,48 @@
+<?php
+declare(strict_types=1);
+
+/**
+ * CakePHP(tm) :  Rapid Development Framework (https://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+ * @link          https://cakefoundation.org CakePHP(tm) Project
+ * @since         4.3.0
+ * @license       https://opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Log\Formatter;
+
+class JsonFormatter extends AbstractFormatter
+{
+    /**
+     * Default config for this class
+     *
+     * @var array
+     */
+    protected $_defaultConfig = [
+        'dateFormat' => DATE_ATOM,
+        'flags' => JSON_UNESCAPED_UNICODE,
+    ];
+
+    /**
+     * @param array $config Formatter config
+     */
+    public function __construct(array $config = [])
+    {
+        $this->setConfig($config);
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public function format($level, string $message, array $context = []): string
+    {
+        $log = ['date' => date($this->_config['dateFormat']), 'level' => (string)$level, 'message' => $message];
+
+        return json_encode($log, $this->_config['flags']);
+    }
+}

+ 27 - 0
tests/TestCase/Log/Engine/ConsoleLogTest.php

@@ -17,6 +17,7 @@ namespace Cake\Test\TestCase\Log\Engine;
 
 use Cake\Console\ConsoleOutput;
 use Cake\Log\Engine\ConsoleLog;
+use Cake\Log\Formatter\JsonFormatter;
 use Cake\TestSuite\TestCase;
 
 /**
@@ -97,6 +98,32 @@ class ConsoleLogTest extends TestCase
     }
 
     /**
+     * Test json formatter
+     *
+     * @return void
+     */
+    public function testJsonFormatter()
+    {
+        $filename = tempnam(sys_get_temp_dir(), 'cake_log_test');
+        $log = new ConsoleLog([
+            'stream' => $filename,
+            'formatter' => [
+                'className' => JsonFormatter::class,
+                'flags' => JSON_HEX_QUOT,
+            ],
+        ]);
+        $log->log('error', 'oh "{p1}"', ['p1' => 'noes']);
+        $fh = fopen($filename, 'r');
+        $line = fgets($fh);
+        $this->assertStringContainsString('\u0022noes\u0022', $line);
+
+        $entry = json_decode($line, true);
+        $this->assertNotNull($entry['date']);
+        $this->assertSame('error', $entry['level']);
+        $this->assertSame('oh "noes"', $entry['message']);
+    }
+
+    /**
      * Test deprecated dateFormat option
      *
      * @return void