From ada57dd4a1aa672a74ef4763f54670d4cb7ba2b9 Mon Sep 17 00:00:00 2001 From: vershinin_so Date: Thu, 14 Feb 2019 10:32:48 +0300 Subject: [PATCH] use mb_ functions in GelfFormatter --- .../Formatter/GelfMessageFormatter.php | 12 +++++------ .../Formatter/GelfMessageFormatterTest.php | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/Monolog/Formatter/GelfMessageFormatter.php b/src/Monolog/Formatter/GelfMessageFormatter.php index e5626794..6e5e33f2 100644 --- a/src/Monolog/Formatter/GelfMessageFormatter.php +++ b/src/Monolog/Formatter/GelfMessageFormatter.php @@ -93,10 +93,10 @@ class GelfMessageFormatter extends NormalizerFormatter ->setLevel($this->logLevels[$record['level']]); // message length + system name length + 200 for padding / metadata - $len = 200 + strlen((string) $record['message']) + strlen($this->systemName); + $len = 200 + mb_strlen((string) $record['message']) + mb_strlen($this->systemName); if ($len > $this->maxLength) { - $message->setShortMessage(substr($record['message'], 0, $this->maxLength)); + $message->setShortMessage(mb_substr($record['message'], 0, $this->maxLength)); } if (isset($record['channel'])) { @@ -113,9 +113,9 @@ class GelfMessageFormatter extends NormalizerFormatter foreach ($record['extra'] as $key => $val) { $val = is_scalar($val) || null === $val ? $val : $this->toJson($val); - $len = strlen($this->extraPrefix . $key . $val); + $len = mb_strlen($this->extraPrefix . $key . $val); if ($len > $this->maxLength) { - $message->setAdditional($this->extraPrefix . $key, substr($val, 0, $this->maxLength)); + $message->setAdditional($this->extraPrefix . $key, mb_substr($val, 0, $this->maxLength)); continue; } $message->setAdditional($this->extraPrefix . $key, $val); @@ -123,9 +123,9 @@ class GelfMessageFormatter extends NormalizerFormatter foreach ($record['context'] as $key => $val) { $val = is_scalar($val) || null === $val ? $val : $this->toJson($val); - $len = strlen($this->contextPrefix . $key . $val); + $len = mb_strlen($this->contextPrefix . $key . $val); if ($len > $this->maxLength) { - $message->setAdditional($this->contextPrefix . $key, substr($val, 0, $this->maxLength)); + $message->setAdditional($this->contextPrefix . $key, mb_substr($val, 0, $this->maxLength)); continue; } $message->setAdditional($this->contextPrefix . $key, $val); diff --git a/tests/Monolog/Formatter/GelfMessageFormatterTest.php b/tests/Monolog/Formatter/GelfMessageFormatterTest.php index 012de3cd..bfefd6a9 100644 --- a/tests/Monolog/Formatter/GelfMessageFormatterTest.php +++ b/tests/Monolog/Formatter/GelfMessageFormatterTest.php @@ -251,6 +251,26 @@ class GelfMessageFormatterTest extends \PHPUnit\Framework\TestCase $this->assertGreaterThanOrEqual(131289, $length, 'The message should not be truncated'); } + public function testFormatWithLargeCyrillicData() + { + $formatter = new GelfMessageFormatter(); + $record = [ + 'level' => Logger::ERROR, + 'level_name' => 'ERROR', + 'channel' => 'meh', + 'context' => ['exception' => str_repeat('а', 32767)], + 'datetime' => new \DateTimeImmutable("@0"), + 'extra' => ['key' => str_repeat('б', 32767)], + 'message' => str_repeat('в', 32767), + ]; + $message = $formatter->format($record); + $messageArray = $message->toArray(); + + $messageString = json_encode($messageArray); + + $this->assertIsString($messageString); + } + private function isLegacy() { return interface_exists('\Gelf\IMessagePublisher');