monolog: add CeeFormatter
authorFilippo Giunchedi <fgiunchedi@wikimedia.org>
Wed, 5 Dec 2018 15:00:04 +0000 (16:00 +0100)
committerFilippo Giunchedi <fgiunchedi@wikimedia.org>
Fri, 7 Dec 2018 08:04:54 +0000 (09:04 +0100)
This formatter extends LogstashFormatter to prefix records with "cee token"
used for syslog and JSON structured logging. See also related task for more
context.

Bug: T211124
Change-Id: I3cdeb4c666f54039b5e8ecc67bd4937220333526

autoload.php
includes/debug/logger/monolog/CeeFormatter.php [new file with mode: 0644]
tests/phpunit/includes/debug/logger/monolog/CeeFormatterTest.php [new file with mode: 0644]

index 02e35a8..749ce9f 100644 (file)
@@ -886,6 +886,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Logger\\MonologSpi' => __DIR__ . '/includes/debug/logger/MonologSpi.php',
        'MediaWiki\\Logger\\Monolog\\AvroFormatter' => __DIR__ . '/includes/debug/logger/monolog/AvroFormatter.php',
        'MediaWiki\\Logger\\Monolog\\BufferHandler' => __DIR__ . '/includes/debug/logger/monolog/BufferHandler.php',
+       'MediaWiki\\Logger\\Monolog\\CeeFormatter' => __DIR__ . '/includes/debug/logger/monolog/CeeFormatter.php',
        'MediaWiki\\Logger\\Monolog\\KafkaHandler' => __DIR__ . '/includes/debug/logger/monolog/KafkaHandler.php',
        'MediaWiki\\Logger\\Monolog\\LegacyFormatter' => __DIR__ . '/includes/debug/logger/monolog/LegacyFormatter.php',
        'MediaWiki\\Logger\\Monolog\\LegacyHandler' => __DIR__ . '/includes/debug/logger/monolog/LegacyHandler.php',
diff --git a/includes/debug/logger/monolog/CeeFormatter.php b/includes/debug/logger/monolog/CeeFormatter.php
new file mode 100644 (file)
index 0000000..4b0c6cb
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+
+namespace MediaWiki\Logger\Monolog;
+
+/**
+ * CeeFormatter extends LogstashFormatter to prefix records with a "cee cookie".
+ * The cookie is used to tell JSON and non-JSON messages apart when logging to syslog.
+ * See also: https://www.rsyslog.com/doc/v8-stable/configuration/modules/mmjsonparse.html
+ *
+ * Compatible with Monolog 1.x only.
+ *
+ * @since 1.33
+ */
+class CeeFormatter extends LogstashFormatter {
+       /**
+        * Format records with a cee cookie
+        * @param array $record
+        * @return array
+        */
+       public function format( array $record ) {
+               return "@cee: " . parent::format( $record );
+       }
+}
diff --git a/tests/phpunit/includes/debug/logger/monolog/CeeFormatterTest.php b/tests/phpunit/includes/debug/logger/monolog/CeeFormatterTest.php
new file mode 100644 (file)
index 0000000..7d0c839
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+
+namespace MediaWiki\Logger\Monolog;
+
+/**
+ * @covers \MediaWiki\Logger\Monolog\CeeFormatter
+ */
+class CeeFormatterTest extends \PHPUnit\Framework\TestCase {
+       public function testV1() {
+               $ls_formatter = new LogstashFormatter( 'app', 'system', null, 'ctx_', LogstashFormatter::V1 );
+               $cee_formatter = new CeeFormatter( 'app', 'system', null, 'ctx_', LogstashFormatter::V1 );
+               $record = [ 'extra' => [ 'url' => 1 ], 'context' => [ 'url' => 2 ] ];
+               $this->assertSame(
+                       $cee_formatter->format( $record ),
+                       "@cee: " . $ls_formatter->format( $record ) );
+       }
+}