From 6bc1a444dbd287a0d88278fe0ed105f2b93263ca Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sat, 2 Apr 2016 13:53:47 +0100 Subject: [PATCH 1/2] Truncate messages if they reach the max length of GELF messages, fixes #751 --- .../Formatter/GelfMessageFormatter.php | 30 +++++++++++++++++-- .../Formatter/GelfMessageFormatterTest.php | 18 +++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/Monolog/Formatter/GelfMessageFormatter.php b/src/Monolog/Formatter/GelfMessageFormatter.php index 1e431750..b4de509d 100644 --- a/src/Monolog/Formatter/GelfMessageFormatter.php +++ b/src/Monolog/Formatter/GelfMessageFormatter.php @@ -22,6 +22,8 @@ use Gelf\Message; */ class GelfMessageFormatter extends NormalizerFormatter { + const MAX_LENGTH = 32766; + /** * @var string the name of the system for the Gelf log message */ @@ -79,24 +81,48 @@ class GelfMessageFormatter extends NormalizerFormatter ->setHost($this->systemName) ->setLevel($this->logLevels[$record['level']]); + // start count with message length + system name length + 200 for padding / metadata + $len = 200 + strlen((string) $record['message']) + strlen($this->systemName); + + if ($len > self::MAX_LENGTH) { + $message->setShortMessage(substr($record['message'], 0, self::MAX_LENGTH - 200)); + + return $message; + } + if (isset($record['channel'])) { $message->setFacility($record['channel']); + $len += strlen($record['channel']); } if (isset($record['extra']['line'])) { $message->setLine($record['extra']['line']); + $len += 10; unset($record['extra']['line']); } if (isset($record['extra']['file'])) { $message->setFile($record['extra']['file']); + $len += strlen($record['extra']['file']); unset($record['extra']['file']); } foreach ($record['extra'] as $key => $val) { - $message->setAdditional($this->extraPrefix . $key, is_scalar($val) ? $val : $this->toJson($val)); + $val = is_scalar($val) ? $val : $this->toJson($val); + $len += strlen($this->extraPrefix . $key . $val); + if ($len > self::MAX_LENGTH) { + $message->setAdditional($this->extraPrefix . $key, substr($val, 0, self::MAX_LENGTH - $len)); + break; + } + $message->setAdditional($this->extraPrefix . $key, $val); } foreach ($record['context'] as $key => $val) { - $message->setAdditional($this->contextPrefix . $key, is_scalar($val) ? $val : $this->toJson($val)); + $val = is_scalar($val) ? $val : $this->toJson($val); + $len += strlen($this->contextPrefix . $key . $val); + if ($len > self::MAX_LENGTH) { + $message->setAdditional($this->contextPrefix . $key, substr($val, 0, self::MAX_LENGTH - $len)); + break; + } + $message->setAdditional($this->contextPrefix . $key, $val); } if (null === $message->getFile() && isset($record['context']['exception']['file'])) { diff --git a/tests/Monolog/Formatter/GelfMessageFormatterTest.php b/tests/Monolog/Formatter/GelfMessageFormatterTest.php index 0f66a7fc..2052cf66 100644 --- a/tests/Monolog/Formatter/GelfMessageFormatterTest.php +++ b/tests/Monolog/Formatter/GelfMessageFormatterTest.php @@ -197,6 +197,24 @@ class GelfMessageFormatterTest extends \PHPUnit_Framework_TestCase $this->assertEquals('pair', $message_array['_EXTkey']); } + public function testFormatWithLargeData() + { + $formatter = new GelfMessageFormatter(); + $record = array( + 'level' => Logger::ERROR, + 'level_name' => 'ERROR', + 'channel' => 'meh', + 'context' => array('exception' => str_repeat(' ', 32767)), + 'datetime' => new \DateTime("@0"), + 'extra' => array('key' => str_repeat(' ', 32767)), + 'message' => 'log' + ); + $message = $formatter->format($record); + $messageArray = $message->toArray(); + $this->assertLessThanOrEqual(32766, strlen($messageArray['_key'])); + $this->assertLessThanOrEqual(32766, strlen($messageArray['_ctxt_exception'])); + } + private function isLegacy() { return interface_exists('\Gelf\IMessagePublisher'); From 064b38c16790249488e7a8b987acf1c9d7383c09 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sat, 2 Apr 2016 14:12:58 +0100 Subject: [PATCH 2/2] Update changelog --- CHANGELOG.mdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.mdown b/CHANGELOG.mdown index 3f33a286..a7989125 100644 --- a/CHANGELOG.mdown +++ b/CHANGELOG.mdown @@ -1,3 +1,8 @@ +### 1.18.2 (2016-04-02) + + * Fixed ElasticaFormatter to use more precise dates + * Fixed GelfMessageFormatter sending too long messages + ### 1.18.1 (2016-03-13) * Fixed SlackHandler bug where slack dropped messages randomly