From 875b7c50e7913370d5a4448eb9ebde91ebf00797 Mon Sep 17 00:00:00 2001 From: Frank Dekker Date: Thu, 19 Jun 2025 20:39:33 +0200 Subject: [PATCH] Fix monolog line parser to avoid breaking on json with [ and { combinations --- README.md | 2 +- docs/configuration-reference.md | 4 ++-- src/Service/File/Monolog/MonologLineParser.php | 4 ++-- tests/Unit/Service/File/Monolog/MonologLineParserTest.php | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 313bbdcd..c03d850f 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ fd_log_viewer: downloadable: false deletable: false start_of_line_pattern: '/^\[\d{4}-\d{2}-\d{2}[^]]*]\s+\S+\.\S+:/' - log_message_pattern: '/^\[(?P[^\]]+)\]\s+(?P[^\.]+)\.(?P[^:]+):\s+(?P.*)\s+(?P[[{].*?[\]}])\s+(?P[[{].*?[\]}])\s+$/s' + log_message_pattern: '/^\[(?P[^\]]+)\]\s+(?P[^\.]+)\.(?P[^:]+):\s+(?P.*)\s+(?P(?:{.*?}|\[.*?]))\s+(?P(?:{.*?}|\[.*?]))\s+$/s' date_format: null hosts: diff --git a/docs/configuration-reference.md b/docs/configuration-reference.md index 8a273584..40a0fc23 100644 --- a/docs/configuration-reference.md +++ b/docs/configuration-reference.md @@ -21,7 +21,7 @@ fd_log_viewer: downloadable: false deletable: false start_of_line_pattern: '/^\[\d{4}-\d{2}-\d{2}[^]]*]\s+\S+\.\S+:/' - log_message_pattern: '/^\[(?P[^\]]+)\]\s+(?P[^\.]+)\.(?P[^:]+):\s+(?P.*)\s+(?P[[{].*?[\]}])\s+(?P[[{].*?[\]}])\s+$/s' + log_message_pattern: '/^\[(?P[^\]]+)\]\s+(?P[^\.]+)\.(?P[^:]+):\s+(?P.*)\s+(?P(?:{.*?}|\[.*?]))\s+(?P(?:{.*?}|\[.*?]))\s+$/s' date_format: null hosts: @@ -172,7 +172,7 @@ This regex pattern is used to parse the log entry into the following named group - `extra` The default monolog regex -pattern `/^\[(?P[^\]]+)\]\s+(?P[^\.]+)\.(?P[^:]+):\s+(?P.*)\s+(?P[[{].*?[\]}])\s+(?P[[{].*?[\]}])\s+$/s` +pattern `/^\[(?P[^\]]+)\]\s+(?P[^\.]+)\.(?P[^:]+):\s+(?P.*)\s+(?P(?:{.*?}|\[.*?]))\s+(?P(?:{.*?}|\[.*?]))\s+$/s` matches: ```text diff --git a/src/Service/File/Monolog/MonologLineParser.php b/src/Service/File/Monolog/MonologLineParser.php index 79d5ab39..e4565efe 100644 --- a/src/Service/File/Monolog/MonologLineParser.php +++ b/src/Service/File/Monolog/MonologLineParser.php @@ -16,8 +16,8 @@ class MonologLineParser implements LogLineParserInterface '/^\[(?P[^\]]+)\]\s+' . '(?P[^\.]+)\.(?P[^:]+):\s+' . '(?P.*)\s+' . - '(?P[[{].*?[\]}])\s+' . - '(?P[[{].*?[\]}])\s+$/s'; + '(?P(?:{.*?}|\[.*?]))\s+' . + '(?P(?:{.*?}|\[.*?]))\s+$/s'; private readonly string $logLinePattern; diff --git a/tests/Unit/Service/File/Monolog/MonologLineParserTest.php b/tests/Unit/Service/File/Monolog/MonologLineParserTest.php index 1059af8d..c57a450d 100644 --- a/tests/Unit/Service/File/Monolog/MonologLineParserTest.php +++ b/tests/Unit/Service/File/Monolog/MonologLineParserTest.php @@ -42,11 +42,11 @@ public function testParseWithContextAndExtra(): void 'severity' => 'DEBUG', 'channel' => 'app', 'message' => 'message', - 'context' => ['context' => 'context'], - 'extra' => ['extra' => 'extra'], + 'context' => ['context' => '[object]context'], + 'extra' => ['extra' => '[object]extra'], ]; - $result = $this->parser->parse('[2000-01-01T00:00:00.000] app.DEBUG: message {"context":"context"} {"extra":"extra"}' . "\n"); + $result = $this->parser->parse('[2000-01-01T00:00:00.000] app.DEBUG: message {"context":"[object]context"} {"extra":"[object]extra"}' . "\n"); static::assertSame($expected, $result); }