From 320909a1d1c68f134603469f866a6991c753639f Mon Sep 17 00:00:00 2001 From: Pavel Bychko Date: Sun, 26 Jun 2022 12:34:03 +0300 Subject: [PATCH 1/2] Fix replaceNewlines method to avoid replacing escaped backslashes, closes #1721, fixes #1720 --- src/Monolog/Formatter/LineFormatter.php | 6 +++++- tests/Monolog/Formatter/LineFormatterTest.php | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Monolog/Formatter/LineFormatter.php b/src/Monolog/Formatter/LineFormatter.php index 69dfee5c..b31b2971 100644 --- a/src/Monolog/Formatter/LineFormatter.php +++ b/src/Monolog/Formatter/LineFormatter.php @@ -186,7 +186,11 @@ class LineFormatter extends NormalizerFormatter { if ($this->allowInlineLineBreaks) { if (0 === strpos($str, '{')) { - return str_replace(array('\r', '\n'), array("\r", "\n"), $str); + $str = preg_replace('/(?assertRegexp('{^\['.date('Y-m-d').'] core\.CRITICAL: foobar \{"exception":"\[object] \(RuntimeException\(code: 0\): Foo at '.preg_quote(substr($path, 1, -1)).':'.(__LINE__ - 8).'\)\n\[stacktrace]\n#0}', $message); } + public function testInlineLineBreaksRespectsEscapedBackslashes() + { + $formatter = new LineFormatter(null, 'Y-m-d'); + $formatter->allowInlineLineBreaks(); + + self::assertSame('{"test":"foo'."\n".'bar\\\\name-with-n"}', $formatter->stringify(["test" => "foo\nbar\\name-with-n"])); + } + public function testDefFormatWithExceptionAndStacktraceParserFull() { $formatter = new LineFormatter(null, 'Y-m-d'); From ffd505543cf54c32b6bb8a133aeb773d4a740547 Mon Sep 17 00:00:00 2001 From: Lusso Luca Date: Fri, 22 Jul 2022 16:46:43 +0200 Subject: [PATCH 2/2] Add RFC 5424 level (7 to 0) support to Logger::log and Logger::addRecord, fixes #1686 (#1723) Co-authored-by: Jordi Boggiano --- src/Monolog/Logger.php | 28 ++++++++++++++++++++++++++-- tests/Monolog/LoggerTest.php | 31 +++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/Monolog/Logger.php b/src/Monolog/Logger.php index 09918520..1ab75b9e 100644 --- a/src/Monolog/Logger.php +++ b/src/Monolog/Logger.php @@ -111,6 +111,22 @@ class Logger implements LoggerInterface, ResettableInterface self::EMERGENCY => 'EMERGENCY', ]; + /** + * Mapping between levels numbers defined in RFC 5424 and Monolog ones + * + * @phpstan-var array $rfc_5424_levels + */ + private const RFC_5424_LEVELS = [ + 7 => self::DEBUG, + 6 => self::INFO, + 5 => self::NOTICE, + 4 => self::WARNING, + 3 => self::ERROR, + 2 => self::CRITICAL, + 1 => self::ALERT, + 0 => self::EMERGENCY, + ]; + /** * @var string */ @@ -301,7 +317,7 @@ class Logger implements LoggerInterface, ResettableInterface /** * Adds a log record. * - * @param int $level The logging level + * @param int $level The logging level (a Monolog or RFC 5424 level) * @param string $message The log message * @param mixed[] $context The log context * @param DateTimeImmutable $datetime Optional log date to log into the past or future @@ -311,6 +327,10 @@ class Logger implements LoggerInterface, ResettableInterface */ public function addRecord(int $level, string $message, array $context = [], DateTimeImmutable $datetime = null): bool { + if (isset(self::RFC_5424_LEVELS[$level])) { + $level = self::RFC_5424_LEVELS[$level]; + } + if ($this->detectCycles) { $this->logDepth += 1; } @@ -520,7 +540,7 @@ class Logger implements LoggerInterface, ResettableInterface * * This method allows for compatibility with common interfaces. * - * @param mixed $level The log level + * @param mixed $level The log level (a Monolog, PSR-3 or RFC 5424 level) * @param string|Stringable $message The log message * @param mixed[] $context The log context * @@ -532,6 +552,10 @@ class Logger implements LoggerInterface, ResettableInterface throw new \InvalidArgumentException('$level is expected to be a string or int'); } + if (isset(self::RFC_5424_LEVELS[$level])) { + $level = self::RFC_5424_LEVELS[$level]; + } + $level = static::toMonologLevel($level); $this->addRecord($level, (string) $message, $context); diff --git a/tests/Monolog/LoggerTest.php b/tests/Monolog/LoggerTest.php index 0b07a7cf..fd99df20 100644 --- a/tests/Monolog/LoggerTest.php +++ b/tests/Monolog/LoggerTest.php @@ -62,6 +62,37 @@ class LoggerTest extends \PHPUnit\Framework\TestCase $this->assertEquals(Logger::toMonologLevel('emergency'), 600); } + /** + * @covers Monolog\Logger::addRecord + * @covers Monolog\Logger::log + */ + public function testConvertRFC5424ToMonologLevelInAddRecordAndLog() + { + $logger = new Logger('test'); + $handler = new TestHandler; + $logger->pushHandler($handler); + + foreach ([ + 7 => 100, + 6 => 200, + 5 => 250, + 4 => 300, + 3 => 400, + 2 => 500, + 1 => 550, + 0 => 600, + ] as $rfc5424Level => $monologLevel) { + $handler->reset(); + $logger->addRecord($rfc5424Level, 'test'); + $logger->log($rfc5424Level, 'test'); + $records = $handler->getRecords(); + + self::assertCount(2, $records); + self::assertSame($monologLevel, $records[0]['level']); + self::assertSame($monologLevel, $records[1]['level']); + } + } + /** * @covers Monolog\Logger::getLevelName */