'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',
--- /dev/null
+<?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 );
+ }
+}
--- /dev/null
+<?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 ) );
+ }
+}